Здравствуйте shabshay, Вы писали:
S>Здравствуйте Кодт, Вы писали:
К>>Здравствуйте Micker, Вы писали:
S>>>>Работает :up: , но непонял почему :( , объясни для тех кто на бронепоезде и с первого раза не въежжает.
К>>К>>struct s { BYTE b1; BYTE b2; DWORD dw3; BYTE b4; };
К>>+-------------------+-------------------+-------------------+
К>>+----+----+----+----+----+----+----+----+----+----+----+----+
К>>| b1 | b2 | | | <------dw3------> | b4 | | | | -- sizeof(s)==12
К>>+----+----+----+----+----+----+----+----+----+----+----+----+
К>> |--------> |------------->
К>> выравнивание до границы слова
К>>struct p { BYTE b1; BYTE b2; BYTE b3; DWORD dw4; };
К>>+-------------------+-------------------+
К>>+----+----+----+----+----+----+----+----+
К>>| b1 | b2 | b3 | | <------dw4------> | -- sizeof(p)==8
К>>+----+----+----+----+----+----+----+----+
К>> |--->
К>> выравнивание до границы слова
К>>pragma pack(push,1);
К>>+-------------------+-------------------+
К>>+----+----+----+----+----+----+----+
К>>| b1 | b2 | <------dw3------> | b4 | -- sizeof(s)==7
К>>+----+----+----+----+----+----+----+
К>>+----+----+----+----+----+----+----+
К>>| b1 | b2 | b3 | <------dw4------> | -- sizeof(p)==7
К>>+----+----+----+----+----+----+----+
К>>
S> :super:
Вообще говоря, самый приличный вариант { DWORD, BYTE, BYTE, BYTE } (7). Все типы выровнены.
Т.к. доступ к невыровненным данным ( т.е. адрес не кратен размеру типа )
занимает больше времени. Рихтер пишет что-то типа,
что процессор x86 это делает сам (раз в 20 дольше чем для выровненного типа ),
а процессоры Alpha генерят исключения, которые обрабатывает OS ( в 1000-2000 раз медленнее ).
Более того можно (не помню как, см. Рихтер ) сделать чтобы исключение генерилось
и для x86.