std::optional 成员是否连续存储?

Are std::optional members stored contiguously?

我想我对可选值的存储方式有点困惑。在构建包含 std::optional<T> 成员的 class 或结构时,这些成员会连续存储在内存中还是动态分配可选?例如,下面的结构会是一个连续的内存块吗?

struct Material
    {
        std::string name;
        std::optional<size_t> albedo;
        std::optional<size_t> normal;
        std::optional<size_t> metalness;
        std::optional<size_t> roughness;
        std::optional<size_t> ao; // ambient occlusion
        bool hasAlphaChannel = false;
    };

根据标准std::optional禁止直接成员使用动态内存。

例如,一种可能的布局可能是:

template<class T>
class optional
{
    bool engaged;
    union {
        T value;
        unsigned char reserved;
    };
};

optional 要求不使用动态分配。

If an optional contains a value, the value is guaranteed to be allocated as part of the optional object footprint, i.e. no dynamic memory allocation ever takes place. Thus, an optional object models an object, not a pointer, even though operator*() and operator->() are defined.

https://en.cppreference.com/w/cpp/utility/optional

还有optional的成员变量,还有可能出现的padding。所以不,它们不一定是连续的,但它们在您声明它们的对象中。