А есть ли в стандарте что-нибудь про то, что массивы с разным количеством элементов должны иметь разный размер?
Например:
using a = char[1];
using b = char[2];
static_assert(sizeof(a) != sizeof(b));
Тут ассерт по стандарту или это implementation defined?
Здравствуйте, koenjihyakkei, Вы писали:
K>А есть ли в стандарте что-нибудь про то, что массивы с разным количеством элементов должны иметь разный размер?
Загляни в
[expr.sizeof] — там про весь sizeof всего полстранички текста.
Здравствуйте, 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.
Может об этом(выравнивание не может быть больше размера) тоже что-то в стандарте есть?
Здравствуйте, 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, то в массиве появятся элементы с нарушением выравнивания. И поэтому для всех типов, которые могут быть элементами массива, должно такое свойство выполняться.