Можно ли можно использовать заполнение оснований или [[no_unique_address]] для хранения других оснований/участников?C++

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

Сообщение Anonymous »

Примечание в [dcl.attr.nouniqueaddr] < /code> говорит: < /p>

[Примечание 1: Нестатический член данных может поделиться адресом другого нестатического члена данных или базового класса, а любая padding, которые обычно будут вставлены в конце объекта, можно повторно используется в качестве хранилища для других членов < />. Примечание]

(Bold Mine)
Поскольку единственный нормативный эффект no_unique_address делает объект , потенциально оверлепия , какого базового классов автоматически, те же эффекты должны применяться к базовым классам. [intro.object] /10 < /code> < /p>

, если объект не является бит-полем или субобектом нулевого размера, адрес этого объекта-это адрес первого байта, который он занимает. размер
и они разных типов; в противном случае, они имеют различные адреса и разъединенные байты хранилища .

Это, казалось бы, позволяет перекрывать только если один из объектов имеет ноль (не является потенциально-защищенным и пустым). Для перекрытия: запустить на gcc.godbolt.org

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

struct A
{
int x;
short y;
};

struct B
{
short b;
};

struct C : A, B {};

struct D
{
[[no_unique_address]] A a;
[[no_unique_address]] B b;
};

// Those assertions pass, but I expected the size to be `sizeof(int) * 2` instead.
static_assert(sizeof(C) == sizeof(int) * 3);
static_assert(sizeof(D) == sizeof(int) * 3);
There's also [basic.types.general]/2 that governs memcpy-ing trivially copyable types:

For any object (other than a potentially-overlapping subobject) of trivially copyable type T, ... the underlying bytes ... can be copied into an Массив char ...

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

Допускается ли это повторное использование хвостовой прокладки? до. Возможно, регрессия?

Подробнее здесь: https://stackoverflow.com/questions/728 ... -other-bas
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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