Является ли std:: variant разрешено выделять память для своих членов?

Мне было интересно, должна ли реализация std::variant быть обязательно "плоской" или разрешено динамически распределять память для своих членов, так что последовательность вариантов будет вырождаться в последовательность указателей, тем самым разрушая местность кеша.

Ответы

Ответ 1

Нет, очень явно. Из [variant.variant]:

Любой экземпляр variant в любой момент времени либо имеет значение одного из его альтернативных типов, либо не имеет значения. Если экземпляр variant содержит значение альтернативного типа T, это означает, что значение типа T, называемое содержащимся в вариантном объекте значением, выделяется в пределах хранилища объекта variant. Реализации не разрешено использовать дополнительное хранилище, такое как динамическая память, для размещения содержащегося значения.. Содержащееся значение должно быть выделено в области хранилища variant, подходящей для всех типов в Types.... Определяется реализация, поддерживаются ли надстрочные типы.

Ответ 2

Согласно cppreference ::std::variant не должен выделять динамическую память.

Как и в случае с объединениями, если вариант имеет значение некоторого типа объекта T, представление объекта T распределяется непосредственно внутри объекта представление самого варианта. Вариант не допускается выделять дополнительную (динамическую) память.