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。所以不,它们不一定是连续的,但它们在您声明它们的对象中。
我想我对可选值的存储方式有点困惑。在构建包含 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。所以不,它们不一定是连续的,但它们在您声明它们的对象中。