выравниваться в памяти?
Ну т.е. например int32_t[256] может по каким либо причинам занимать НЕ 1024 байта?
Интересуюсь по причине желания копировать подобные штуки memcpy, но не уверен насколько это будет переносимо.
Подчеркнусь - речь именно о фундаментальных типах.
В конкретном приведённом примере - не может.
Зависит от ABI. Для x86_64 массив имеет выравнивание своего типа, если размер не превышает 16 байт. Если превышает то идет выравнивание на 16.
Может
Это будет абсолютно переносимо, только не ясно, при чем тут выравнивание?
Да он тебе нагнал...
Ну я просто смело предположил что в каких-то случаях к каждому элементу будет добавляться оверхед. Понимаю что немного бредово звучит, но мало-ли..
С чего? Адресная Арифметика тогда перестанет работать
Адрес следующего элемента - это адрес предыдущего + sizeof элемента. ЭТО ЗАКОН
Тут товарищь видимо именно в виду выравнивание всего блока массива при выделении памяти динамически. И это вообще не выравнивание. А просто адрес
Хорошо. Да, это наверное действительно глупое предположение.
Если речь про оверхеды, то да массивы всегда кладутся последовательно, без паддингов. И полное выравнивание всего блока памяти по алпйнменту составляющего типа. Если создается на стеке или в шлобальном скоупе, и TLS туда же, то требования к выравниванию как я ранее писал. Про динпмическую - да тут выравнивание минимальное от разрядности зависит для 64битных, могу ошибаться но на 16 (Но да все элементы всегда последовательно). А вот паддинги, это уже в структурах и классах. Ну и при раскладке стекового фрейма, .bss, .data и т.д.
Мне казалось, что vector<bool> v(88); может занимать меньше, чем 88 байт, но это не точно
Речь не об этом. vector<bool> - пример "преждевременной оптимизации", баг, но автор о массивах спрашивал
Используй std::copy, для trivially copyable он и будет memcpy.
Обсуждают сегодня