Здравствуйте, _NN_, Вы писали:
_NN>Кстати, тогда, лучше использовать обычный массив так как нет гарантий на то, как выглядит std::array. _NN>Скорее всего, и обычно это так, он равносилен массиву, но нет требований стандарта.
А по-моему, всё предельно ясно расписано: https://timsong-cpp.github.io/cppwp/array. И про фиксированный размер, и про то, что это агрегат. Каких гарантий не хватает?
--
Справедливость выше закона. А человечность выше справедливости.
Re[7]: Placement new для инициализации примитивного типа в с
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, _NN_, Вы писали:
_NN>>Кстати, тогда, лучше использовать обычный массив так как нет гарантий на то, как выглядит std::array. _NN>>Скорее всего, и обычно это так, он равносилен массиву, но нет требований стандарта.
R>А по-моему, всё предельно ясно расписано: https://timsong-cpp.github.io/cppwp/array. И про фиксированный размер, и про то, что это агрегат. Каких гарантий не хватает?
Здравствуйте, _NN_, Вы писали:
R>>А по-моему, всё предельно ясно расписано: https://timsong-cpp.github.io/cppwp/array. И про фиксированный размер, и про то, что это агрегат. Каких гарантий не хватает?
_NN>sizeof(array<int,10>) == sizeof(int[10])
_NN>Этой гарантии не хватает.
Разве это не следует из того, что это аггрегатный тип и contiguous container фиксированного размера? Что может этому помешать — разное выравнивание?
--
Справедливость выше закона. А человечность выше справедливости.
Здравствуйте, 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 нет?
Здравствуйте, _NN_, Вы писали:
R>>Разве это не следует из того, что это аггрегатный тип и contiguous container фиксированного размера? Что может этому помешать — разное выравнивание?
_NN>Ну да. _NN>Компилятор вполне может добавить для убоства выравнивание. _NN>Почему для структуры B мы можем подумать про выравнивание, а в A нет? _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/2.
По совокупности всех требований, я всё же думаю, что можно нассчитывать на то, что размеры и расположение данных в std::array совпадают со встроенными массивами.
--
Справедливость выше закона. А человечность выше справедливости.
std::array это агрегат с С массивом внутри.
У него нет до самого массива никаких полей.
Тут всё верно.
Но вот после массива, в std::array как и в любом другом агрегатном типе нет гарантии на отсутствие дополнительного выравнивания.
На практике компилятор не добавит, но все же не гарантируется.
Здравствуйте, _NN_, Вы писали:
_NN>Но вот после массива, в std::array как и в любом другом агрегатном типе нет гарантии на отсутствие дополнительного выравнивания. _NN>На практике компилятор не добавит, но все же не гарантируется.
Ты имеешь в виду какой-то чисто технологический паддинг, не дата-мембер? Ну, тут я не готов говорить. Нужно будет ещё покопаться.
--
Справедливость выше закона. А человечность выше справедливости.
Re[13]: Placement new для инициализации примитивного типа в
Здравствуйте, rg45, Вы писали:
R>Здравствуйте, _NN_, Вы писали:
_NN>>Но вот после массива, в std::array как и в любом другом агрегатном типе нет гарантии на отсутствие дополнительного выравнивания. _NN>>На практике компилятор не добавит, но все же не гарантируется.
R>Ты имеешь в виду какой-то чисто технологический паддинг, не дата-мембер? Ну, тут я не готов говорить. Нужно будет ещё покопаться.
Да.
Гарантий на его отсутствия у нас нет.
Можно конечно в код добавить static_assert(sizeof MyVariant == sizeof T[N]).
Тогда я буду спокоен