> Кстати, a inst = {1,1} тоже вполне работает . Так вот, не > могу найти в стандарте С++ это дело. Где про это > растолковано? Это и есть мой вопрос.
В Ричи и Кернигане точно есть. У Страустрапа тоже должно быть, порыться надо, но смысл?...
Подводные камни не в этом!
Явный акцент делается на массив структур. Упоминается, что компилятор для оптимизации работ строк кэша может размещать элементы массива структур с адреса кратного степени двойки, а размер структуры может быть больше, чем сумма размера ее элементов.
Причем все зависит от компилятора. Во многих есть ключик выравнивания размеров структур.
Например для связки AMD/GCC структура, состоящая из трех однобайтовых элементов может быть расширена до четырехбайтового размера. Тогда массив из двух структур инициализировать при помощи memset() нужно будет надлежащим образом, учитывая эти особенности.
А, вот, к стати по поводу распределения адресного пространства говорится, что оно должно распределяться по порядку (насколько я помню). Не помню только возможны ли "дырки"? То есть
struct {
char a;
long b;
} s;
sizeof( s.a ) + sizeof( s.b ) != sizeof ( struct s );
1 + 4 != 8
&s.a < &s.b
то есть "a" не переедет в конец - смысла нет.
У структуры
struct {
short a;
long b;
short c;
} st;
размер может быть 12 байт, а не 8.
с 0 адреса будет "a", размером 2 байта
с 2 адреса будет "дырка", размером 2 байта
с 4 адреса будет "b", размером 4 байта
с 8 адреса будет "c", размером 2 байта
с 10 адреса опять "дырка", размером 2 байта
Элемент "c" может не переехать на адрес 2, не смотря на глубокий смысл.
Размер структуры должен учитывать все "дырки" для правильного динамического выделения памяти для масива структур.
Некоторые особенности могут зависеть от компиляторов и стандартов.
---
> Спасибо. >
|