Re[6]: Проблема с sizeof
От: KonstantinA Россия  
Дата: 16.04.02 15:52
Оценка:
Здравствуйте 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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.