Re[6]: Placement new для инициализации примитивного типа в с
От: rg45 СССР  
Дата: 08.10.25 07:01
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Кстати, тогда, лучше использовать обычный массив так как нет гарантий на то, как выглядит std::array.

_NN>Скорее всего, и обычно это так, он равносилен массиву, но нет требований стандарта.

А по-моему, всё предельно ясно расписано: https://timsong-cpp.github.io/cppwp/array. И про фиксированный размер, и про то, что это агрегат. Каких гарантий не хватает?
--
Справедливость выше закона. А человечность выше справедливости.
Re[7]: Placement new для инициализации примитивного типа в с
От: _NN_  
Дата: 08.10.25 15:19
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, _NN_, Вы писали:


_NN>>Кстати, тогда, лучше использовать обычный массив так как нет гарантий на то, как выглядит std::array.

_NN>>Скорее всего, и обычно это так, он равносилен массиву, но нет требований стандарта.

R>А по-моему, всё предельно ясно расписано: https://timsong-cpp.github.io/cppwp/array. И про фиксированный размер, и про то, что это агрегат. Каких гарантий не хватает?


sizeof(array<int,10>) == sizeof(int[10])

Этой гарантии не хватает.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[8]: Placement new для инициализации примитивного типа в с
От: rg45 СССР  
Дата: 08.10.25 15:32
Оценка:
Здравствуйте, _NN_, Вы писали:

R>>А по-моему, всё предельно ясно расписано: https://timsong-cpp.github.io/cppwp/array. И про фиксированный размер, и про то, что это агрегат. Каких гарантий не хватает?


_NN>sizeof(array<int,10>) == sizeof(int[10])


_NN>Этой гарантии не хватает.


Разве это не следует из того, что это аггрегатный тип и contiguous container фиксированного размера? Что может этому помешать — разное выравнивание?
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 08.10.2025 15:33 rg45 . Предыдущая версия .
Re[9]: Placement new для инициализации примитивного типа в с
От: _NN_  
Дата: 09.10.25 17:02
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, _NN_, Вы писали:


R>>>А по-моему, всё предельно ясно расписано: https://timsong-cpp.github.io/cppwp/array. И про фиксированный размер, и про то, что это агрегат. Каких гарантий не хватает?


_NN>>sizeof(array<int,10>) == sizeof(int[10])


_NN>>Этой гарантии не хватает.


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


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


struct B{
 int32_t a;
 char c[3];
};
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[10]: Placement new для инициализации примитивного типа в
От: rg45 СССР  
Дата: 09.10.25 17:56
Оценка:
Здравствуйте, _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>



Такого варианта, как в struct B, быть не может, т.к. это нарушет требования пунткта 23.3.3.1/2:

An array is an aggregate that can be list-initialized with up to N elements whose types are convertible to T.


А ещё и использование structured binding накрывается медным тазом: https://coliru.stacked-crooked.com/a/f1d776aa7584f914.

В описании 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/2.

По совокупности всех требований, я всё же думаю, что можно нассчитывать на то, что размеры и расположение данных в std::array совпадают со встроенными массивами.
--
Справедливость выше закона. А человечность выше справедливости.
Отредактировано 09.10.2025 18:26 rg45 . Предыдущая версия . Еще …
Отредактировано 09.10.2025 18:23 rg45 . Предыдущая версия .
Отредактировано 09.10.2025 18:19 rg45 . Предыдущая версия .
Отредактировано 09.10.2025 18:08 rg45 . Предыдущая версия .
Отредактировано 09.10.2025 18:07 rg45 . Предыдущая версия .
Отредактировано 09.10.2025 18:07 rg45 . Предыдущая версия .
Отредактировано 09.10.2025 18:06 rg45 . Предыдущая версия .
Отредактировано 09.10.2025 18:04 rg45 . Предыдущая версия .
Отредактировано 09.10.2025 18:00 rg45 . Предыдущая версия .
Re[11]: Placement new для инициализации примитивного типа в
От: _NN_  
Дата: 10.10.25 14:08
Оценка:
std::array это агрегат с С массивом внутри.
У него нет до самого массива никаких полей.
Тут всё верно.
Но вот после массива, в std::array как и в любом другом агрегатном типе нет гарантии на отсутствие дополнительного выравнивания.
На практике компилятор не добавит, но все же не гарантируется.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[12]: Placement new для инициализации примитивного типа в
От: rg45 СССР  
Дата: 10.10.25 15:01
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Но вот после массива, в std::array как и в любом другом агрегатном типе нет гарантии на отсутствие дополнительного выравнивания.

_NN>На практике компилятор не добавит, но все же не гарантируется.

Ты имеешь в виду какой-то чисто технологический паддинг, не дата-мембер? Ну, тут я не готов говорить. Нужно будет ещё покопаться.
--
Справедливость выше закона. А человечность выше справедливости.
Re[13]: Placement new для инициализации примитивного типа в
От: _NN_  
Дата: 10.10.25 15:42
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, _NN_, Вы писали:


_NN>>Но вот после массива, в std::array как и в любом другом агрегатном типе нет гарантии на отсутствие дополнительного выравнивания.

_NN>>На практике компилятор не добавит, но все же не гарантируется.

R>Ты имеешь в виду какой-то чисто технологический паддинг, не дата-мембер? Ну, тут я не готов говорить. Нужно будет ещё покопаться.


Да.
Гарантий на его отсутствия у нас нет.
Можно конечно в код добавить static_assert(sizeof MyVariant == sizeof T[N]).
Тогда я буду спокоен
http://rsdn.nemerleweb.com
http://nemerleweb.com
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.