我在想,std::variant
的实现是否必须是“平坦的”,或者它是否允许为其成员动态分配内存,使得一系列变体会退化为指针序列,从而破坏缓存局部性。
我在想,std::variant
的实现是否必须是“平坦的”,或者它是否允许为其成员动态分配内存,使得一系列变体会退化为指针序列,从而破坏缓存局部性。
非常明确,根据[variant.variant]:
任何时候,
variant
的实例要么持有其备选类型中的一个值,要么不持有任何值。当variant
的实例持有备选类型T
的值时,这意味着T
类型的值,被称为变体对象的包含值,分配在variant
对象的存储中。 实现不允许使用额外的存储,如动态内存,来分配包含的值。 所包含的值应该分配在适合于Types...
中所有类型的variant
存储区域中,适当对齐。是否支持超对齐类型是由实现定义的。
::std::variant
不得分配动态内存。