Здравствуйте shabshay, Вы писали:
S> S>Работает , но непонял почему , объясни для тех кто на бронепоезде и с первого раза не въежжает. S>На ATL тоже самое?
Компилятор имеет своийство выравнивать структуры — то есть распологать члены структуры по адресам, кратным 2, 4, 8 и т.д. байт. Это делается для того, что бы ускорить процесс доступа к этим членам (машине по таким адресам лазить). Для этого между членами структуры компилятор отавляет неиспользуемое пространство памяти.
Когда же ты выравниваешь на 1, то компилятор ни чего не выравнивает, а оставляет всё как есть.
Жизнь, как игра —
идея паршивая,
графика обалденная...
Здравствуйте Micker, Вы писали:
M>Компилятор имеет своийство выравнивать структуры — то есть распологать члены структуры по адресам, кратным 2, 4, 8 и т.д. байт. Это делается для того, что бы ускорить процесс доступа к этим членам (машине по таким адресам лазить). Для этого между членами структуры компилятор отавляет неиспользуемое пространство памяти. M>Когда же ты выравниваешь на 1, то компилятор ни чего не выравнивает, а оставляет всё как есть.
Здравствуйте Кодт, Вы писали:
К>Здравствуйте Micker, Вы писали:
S>>>Работает , но непонял почему , объясни для тех кто на бронепоезде и с первого раза не въежжает.
К>
struct sClass
{ // Это может быть и class с публичным доступом, не только struct
// ...int iValue;
// ...
};
// ...
size_t sLen = sizeof( sClass::iValue );
Последний оператор компилится с ошибкой:
C:\Projects\test\test.cpp(21) : error C2070: illegal sizeof operand
Почему?
У меня переменных этого класса нет, поэтому получилось через указатель NULL:
size_t sLen = sizeof( ((sClass*)NULL)->iValue );
Но не извращение ли это? По имени — не может, а через фиктивный указатель — пожалуйста!
Vi2> struct sClass
Vi2> { // Это может быть и class с публичным доступом, не только struct
Vi2> // ...
Vi2> int iValue;
Vi2> // ...
Vi2> };
Vi2>// ...
Vi2> size_t sLen = sizeof( sClass::iValue );
Vi2>
Vi2>Последний оператор компилится с ошибкой: Vi2>C:\Projects\test\test.cpp(21) : error C2070: illegal sizeof operand
Vi2>Почему? Vi2>У меня переменных этого класса нет, поэтому получилось через указатель NULL: Vi2>
Здравствуйте shabshay, Вы писали:
S>Здравствуйте Кодт, Вы писали:
К>>Здравствуйте Micker, Вы писали:
S>>>>Работает :up: , но непонял почему :( , объясни для тех кто на бронепоезде и с первого раза не въежжает.
К>>
Вообще говоря, самый приличный вариант { DWORD, BYTE, BYTE, BYTE } (7). Все типы выровнены.
Т.к. доступ к невыровненным данным ( т.е. адрес не кратен размеру типа )
занимает больше времени. Рихтер пишет что-то типа,
что процессор x86 это делает сам (раз в 20 дольше чем для выровненного типа ),
а процессоры Alpha генерят исключения, которые обрабатывает OS ( в 1000-2000 раз медленнее ).
Более того можно (не помню как, см. Рихтер ) сделать чтобы исключение генерилось
и для x86.
Здравствуйте Zero, Вы писали:
Z>Потому и выдаёт ошибку, что экземпляра нет. Нельзя использовать нестатические Z>члены класса в выражениях ClassName::MemberName.
Зависит от контекста. На территории метода класса 'ClassName' или его потомка можно ссылаться на нестатические члены класса именами вида 'ClassName::MemberName'.
Здравствуйте KonstantinA, Вы писали:
KA>Вообще говоря, самый приличный вариант { DWORD, BYTE, BYTE, BYTE } (7). Все типы выровнены. KA>Т.к. доступ к невыровненным данным ( т.е. адрес не кратен размеру типа ) KA>занимает больше времени. Рихтер пишет что-то типа, KA>что процессор x86 это делает сам (раз в 20 дольше чем для выровненного типа ), KA>а процессоры Alpha генерят исключения, которые обрабатывает OS ( в 1000-2000 раз медленнее ). KA>Более того можно (не помню как, см. Рихтер ) сделать чтобы исключение генерилось KA>и для x86. :down:
Извиняюсь за допущенные неточности:
1.Рихтер не говорит насколько велико замедление на x86.Не менее чем в 2 раза.
2. на Alpha замедление доходит до порога в 100 раз
3. на x86 Windows 2000(98) не меняют флаг процессора ответственны за генерацию исключений из-за невыровненных данных. Поэтому там процессор справляется сам.
4. на Alpha можно поменять флажок в реестре, чтобы система не обрабатывала исключения о невыровненных данных. Тогда программа аварийно завершиться.
5. можно смотреть частоту ошибок выравнивания через perfmon.
6. размер структуры {DWORD,BYTE,BYTE,BYTE} без всяких извращений все-таки 8 байт. Но мне как-то не жалко здесь 1-го байта