bit*_*ask 19 c++ variant dynamic-memory-allocation c++17
我想知道一个实现是否std::variant必须"平坦"或是否允许为其成员动态分配内存,这样一系列变体会退化为一系列指针,从而破坏缓存局部性.
Bar*_*rry 23
不,非常明确.来自[variant.variant]:
variant任何给定时间的任何实例都保存其替代类型之一的值,或者它没有值.当一个实例variant保存一个替代类型的值时T,它意味着T在该对象的存储中分配一个类型的值,称为变量对象的包含值variant.不允许实现使用额外的存储(例如动态内存)来分配包含的值.所包含的值应分配在variant适合所有类型的存储区域中Types....实现定义是否支持过度对齐类型.
根据cppreference ::std::variant一定不能分配动态内存.
与联合一样,如果变量保存某个对象类型T的值,则T 的对象表示直接在变体本身的对象表示内分配.Variant不允许分配额外的(动态)内存.