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