首页 > 解决方案 > std::optional 成员是否连续存储?

问题描述

我想我对如何存储可选值感到有些困惑。在构造包含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;
    };

标签: c++stdstdoptional

解决方案


optional要求不使用动态分配。

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

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

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


推荐阅读