Что такое правильная ментальная модель для [[no_unique_address]] в C ++?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Что такое правильная ментальная модель для [[no_unique_address]] в C ++?

Сообщение Anonymous »

Я недавно узнал о [[no_unique_address]] атрибут в C ++. Согласно cppreference.com:

применяется к имени, объявляемому в объявлении нестатического члена данных, который не является битным полем.
делает этот член-член-субъект потенциально-переполняющимся, то есть, позволяет этому участнику перекрывать другие нестатические участники или базовые подборы его класса. Это означает, что если у члена есть пустой тип класса (например, распределитель без состояния), компилятор может оптимизировать его, чтобы не занять пространство, точно так же, как если бы это было пустой базой. Если участник не является пустым, в нем можно также повторно использоваться для хранения других элементов данных. Но эта часть: < /p>

Если участник не является пустым, любая хвостовая накладка в нем также может быть повторно использовано для хранения других элементов данных. < /P>
< /blockquote>
- это то, что меня путает. его требования к выравниванию и не используется ни одним из объектов, которые подготовлены. Например: < /p>

Код: Выделить всё

struct alignas(8) Test {
char x;
bool y;
};
Здесь, поскольку sizeof (char) == 1 и sizeof (bool) == 1 , размер, необходимый для тестирования экземпляра, составляет 2 байта, которые могут быть подтверждены путем удаления Alignas (8) . Следовательно, введение этого требования выравнивания должно заставить компилятора добавить 6 байтов хвостовой прокладки в структуру теста . Но, по какой -то причине, компилятору не разрешается использовать эти байты для перекрывающегося хранения, если только один член теста не аннотирован с [[no_unique_address]] . Например: < /p>

Код: Выделить всё

struct alignas(8) Test {
char x;
bool y;
};

struct Combine {
[[no_unique_address]] Test test;
bool flag;
};

int main() {
return sizeof(Combine);
}
возвращает 16 , а это:

Код: Выделить всё

struct alignas(8) Test {
[[no_unique_address]] char x;  // 

Подробнее здесь: [url]https://stackoverflow.com/questions/79698364/what-is-correct-mental-model-for-no-unique-address-in-c[/url]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»