3

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

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;
    };
4

2 回答 2

7

optional要求不使用动态分配。

如果一个可选项包含一个值,则保证该值作为可选对象占用空间的一部分进行分配,即不会发生动态内存分配。因此,可选对象建模对象,而不是指针,即使定义了 operator*() 和 operator->()。

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

还有optional可能发生的成员变量和填充。所以不,它们不一定是连续的,但它们在您声明它们的对象内。

于 2021-06-10T14:23:01.750 回答
2

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

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

template<class T>
class optional
{
    bool engaged;
    union {
        T value;
        unsigned char reserved;
    };
};
于 2021-06-10T14:22:27.680 回答