c++ - ¿Está permitido std:: variant para asignar memoria a sus miembros?
dynamic-memory-allocation c++17 (2)
Me preguntaba si una implementación de std::variant
debe ser necesariamente "plana" o si se le permite asignar dinámicamente memoria a sus miembros, de modo que una secuencia de variantes degeneraría en una secuencia de punteros, destruyendo así la localidad de caché.
De acuerdo con cppreference ::std::variant
no se debe asignar memoria dinámica.
Al igual que con las uniones, si una variante contiene un valor de algún tipo de objeto T, la representación del objeto de T se asigna directamente dentro de la representación del objeto de la variante misma. La variante no está permitida para asignar memoria adicional (dinámica).
No, muy explícitamente. De [variant.variant] :
Cualquier instancia de
variant
en un momento dado tiene un valor de uno de sus tipos alternativos o no tiene ningún valor. Cuando una instancia devariant
contiene un valor de tipo alternativoT
, significa que un valor de tipoT
, denominado valor contenido del objeto de variante, se asigna dentro del almacenamiento del objeto devariant
. No se permite que las implementaciones usen almacenamiento adicional, como memoria dinámica, para asignar el valor contenido. El valor contenido se asignará en una región del almacenamiento devariant
adecuadamente alineado para todos los tipos enTypes...
Se define por la implementación si se admiten tipos sobre alineados.