std::可选成员是否连续存储



我想我对如何存储可选值有点困惑。当构造一个包含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;
};

optional必须不使用动态分配。

如果可选包含一个值,则该值保证作为可选对象占用空间的一部分进行分配,即永远不会进行动态内存分配。因此,即使运算符*((和运算符->((已定义。

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

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

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

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

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

最新更新