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