Мне было интересно, должна ли реализация std::variant
быть обязательно "плоской" или разрешено динамически распределять память для своих членов, так что последовательность вариантов будет вырождаться в последовательность указателей, тем самым разрушая местность кеша.
Является ли std:: variant разрешено выделять память для своих членов?
Ответ 1
Нет, очень явно. Из [variant.variant]:
Любой экземпляр
variant
в любой момент времени либо имеет значение одного из его альтернативных типов, либо не имеет значения. Если экземплярvariant
содержит значение альтернативного типаT
, это означает, что значение типаT
, называемое содержащимся в вариантном объекте значением, выделяется в пределах хранилища объектаvariant
. Реализации не разрешено использовать дополнительное хранилище, такое как динамическая память, для размещения содержащегося значения.. Содержащееся значение должно быть выделено в области хранилищаvariant
, подходящей для всех типов вTypes...
. Определяется реализация, поддерживаются ли надстрочные типы.
Ответ 2
Согласно cppreference ::std::variant
не должен выделять динамическую память.
Как и в случае с объединениями, если вариант имеет значение некоторого типа объекта T, представление объекта T распределяется непосредственно внутри объекта представление самого варианта. Вариант не допускается выделять дополнительную (динамическую) память.