Информация об изменениях

Сообщение Re[10]: Placement new для инициализации примитивного типа в от 09.10.2025 17:56

Изменено 09.10.2025 18:00 rg45

Re[10]: Placement new для инициализации примитивного типа в с
Здравствуйте, _NN_, Вы писали:

R>>Разве это не следует из того, что это аггрегатный тип и contiguous container фиксированного размера? Что может этому помешать — разное выравнивание?


_NN>Ну да.

_NN>Компилятор вполне может добавить для убоства выравнивание.
_NN>Почему для структуры B мы можем подумать про выравнивание, а в A нет?
_NN>
_NN>struct A{
_NN> char c[7];
_NN>};

_NN>struct B{
_NN> int32_t a;
_NN> char c[3];
_NN>};
_NN>


В описании std::array до C++14 включительно присутствовали такие строчки:

23.3.2.1 Class template array overview
1 The elements of an array are stored contiguously, meaning that if a is an array<T, N> then it obeys the identity &a[n] == &a[0] + n for all 0 <= n < N.


Это утверждение исключает возможность расположения данных в std::array отличное от расположения данных во встроенных массивах.

Начиная с C++17 просто изменилась структура документа и формулировки, без принципиального изменения эффекта. Просто эти требования переехали в пунткты о contiguous container и contiguous iterator. В частности интересен вот этот пункт.

По совокупности всех требований, я всё же думаю, что можно нассчитывать на то, что размеры и расположение данных в std::array совпадают со встроенными массивами.
Re[10]: Placement new для инициализации примитивного типа в
Здравствуйте, _NN_, Вы писали:

R>>Разве это не следует из того, что это аггрегатный тип и contiguous container фиксированного размера? Что может этому помешать — разное выравнивание?


_NN>Ну да.

_NN>Компилятор вполне может добавить для убоства выравнивание.
_NN>Почему для структуры B мы можем подумать про выравнивание, а в A нет?
_NN>
_NN>struct A{
_NN> char c[7];
_NN>};

_NN>struct B{
_NN> int32_t a;
_NN> char c[3];
_NN>};
_NN>


В описании std::array до C++14 включительно присутствовали такие строчки:

23.3.2.1 Class template array overview
1 The elements of an array are stored contiguously, meaning that if a is an array<T, N> then it obeys the identity &a[n] == &a[0] + n for all 0 <= n < N.


Это утверждение исключает возможность расположения данных в std::array отличное от расположения данных во встроенных массивах.

Начиная с C++17 просто изменилась структура документа и формулировки, без принципиального изменения эффекта. Просто эти требования переехали в пунткты о contiguous container и contiguous iterator. Особенно интересен пункт 24.3.4.14.

По совокупности всех требований, я всё же думаю, что можно нассчитывать на то, что размеры и расположение данных в std::array совпадают со встроенными массивами.