Размер массива, что сказано в стандарте
От: koenjihyakkei Россия  
Дата: 05.12.22 23:10
Оценка:
А есть ли в стандарте что-нибудь про то, что массивы с разным количеством элементов должны иметь разный размер?

Например:
using a = char[1];
using b = char[2];

static_assert(sizeof(a) != sizeof(b));


Тут ассерт по стандарту или это implementation defined?
Re: Размер массива, что сказано в стандарте
От: watchmaker  
Дата: 05.12.22 23:26
Оценка: 4 (1) +1
Здравствуйте, koenjihyakkei, Вы писали:

K>А есть ли в стандарте что-нибудь про то, что массивы с разным количеством элементов должны иметь разный размер?


Загляни в [expr.sizeof] — там про весь sizeof всего полстранички текста.
Re[2]: Размер массива, что сказано в стандарте
От: koenjihyakkei Россия  
Дата: 05.12.22 23:37
Оценка:
Здравствуйте, watchmaker, Вы писали:

W>Загляни в [expr.sizeof] — там про весь sizeof всего полстранички текста.


Да, спасибо! Получается тогда по стандарту, судя по этому:

This implies that the size of an array of n elements is n times the size of an element.


То есть, архитектуры, где выравнивание больше размера элемента, не удовлетворяют стандарту? Например, если alignof(char) == 4 при sizeof(char) == 1.
Может об этом(выравнивание не может быть больше размера) тоже что-то в стандарте есть?
Отредактировано 05.12.2022 23:38 koenjihyakkei . Предыдущая версия .
Re[3]: Размер массива, что сказано в стандарте
От: watchmaker  
Дата: 06.12.22 00:42
Оценка:
Здравствуйте, koenjihyakkei, Вы писали:

K>Например, если alignof(char) == 4 при sizeof(char) == 1.

Такого в С++ не бывает.


Если же ты имел ввиду не char, а например структуру, то компилятор при избыточном выравнивании скорректирует и sizeof:
struct alignas(64) S {
    char c;
};


static_assert(sizeof(S) >= 64 && sizeof(S) % 64 == 0);

// но скорее на практике будет просто выполняться
static_assert(sizeof(S) == 64);

Так получатся опять же из-за массивов. Расстояние между элементами равно sizeof по определению, а если sizeof не будет кратен alignof, то в массиве появятся элементы с нарушением выравнивания. И поэтому для всех типов, которые могут быть элементами массива, должно такое свойство выполняться.
Отредактировано 06.12.2022 0:56 watchmaker . Предыдущая версия . Еще …
Отредактировано 06.12.2022 0:49 watchmaker . Предыдущая версия .
Re[4]: Размер массива, что сказано в стандарте
От: koenjihyakkei Россия  
Дата: 06.12.22 01:01
Оценка:
Здравствуйте, watchmaker, Вы писали:

W>Такого в С++ не бывает.


Ну тогда в стандарте где-то должно быть соответствующее утверждение, разве нет?)

W>Если же ты имел ввиду не char, а например структуру, то компилятор при избыточном выравнивании скорректирует и sizeof:


Не, я именно про примитивные типы, ну и структуры тоже.

Есть задача, одно из решений — это сделать в ллвме выравнивание типов больше их размеров. Но вылазит слишком много проблем, похоже как раз из-за того что выравнивание всегда должно быть меньше либо равно размерe. А обратное, получается, даже не предусматривалось.

Вот и хочется посмотреть на этот пунктик в стандарте: align <= size.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.