Здравствуйте, гость ( Вход | Регистрация )
Алексей1153 | Дата 23.9.2011, 18:30 |
если выравнивание ДЕЙСТВИТЕЛЬНО нужно убрать (а это случаи работы с железом или для точного задания размеров полей структуры по другим причинам), то следует использовать конструкцию
таким образом вернётся предыдущее значение выравнивания В подавляющем же большинстве случаев выравнивание надо оставлять по умолчанию, иначе быстродействие программы может пострадать
по опыту уже знаю, что для каждой отдельной структуры лучше делать отдельные же "скобки" из прагм , то есть не делать прагму сразу для группы структур. Иначе однажды переместишь структуру - и выравнивание пропадёт, так как забудешь к ней прагмы оставить |
|
AXELman4ever | Дата 23.9.2011, 15:23 |
.... И да, с "лишними" битами (и байтами) ничего не происходит, - т.е. значения их содержат "мусор", на них нельзя полагаться. Спасибо большое |
|
Влад | Дата 23.9.2011, 14:44 |
Такая штука называется "выравниванием". И связана она с тем, что чтение из памяти выровненных данных происходит быстрее, чем для невыровненных. Т.е. жертвуя некоторым (обычно небольшим) расходом памяти, увеличивается быстродействие программы. Выравнивание в GCC и MSVC можно задать отличным от дефолтового с помощью #pragma pack. Попробуй сравнить результаты, например, при #pragma pack(1). И да, с "лишними" битами (и байтами) ничего не происходит, - т.е. значения их содержат "мусор", на них нельзя полагаться. |
|
AXELman4ever | Дата 23.9.2011, 13:48 |
Добрый день. Как пояснить следующее: struct A{ char a; char b; char c; }; A a; cout << sizeof(a); // Получаем размер экземпляра класса - 3 байта. а если написать вот так: struct A{ int a; int b; char c; }; A a; cout << sizeof(a); // Получаем размер экземпляра класса - 12 байт. Почему во втором случае идет поправка, а в первом нет? я так понимаю что поправка идет на размер самого большого типа, но почему так? И что происходит с теми битами, которые "поправились"? Спасибо. |
|
Просмотр темы полностью (откроется в новом окне) | |
Текстовая версия | Сейчас: 28.3.2024, 14:35 |