![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
AXELman4ever |
![]()
Сообщение
#1
|
Студент ![]() Группа: Участник Сообщений: 31 Регистрация: 22.9.2011 Пользователь №: 2902 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Добрый день.
Как пояснить следующее: 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 байт. Почему во втором случае идет поправка, а в первом нет? я так понимаю что поправка идет на размер самого большого типа, но почему так? И что происходит с теми битами, которые "поправились"? Спасибо. |
|
|
Влад |
![]()
Сообщение
#2
|
Участник ![]() ![]() Группа: Участник Сообщений: 146 Регистрация: 20.3.2009 Из: Санкт-Петербург Пользователь №: 627 Спасибо сказали: 46 раз(а) Репутация: ![]() ![]() ![]() |
Такая штука называется "выравниванием". И связана она с тем, что чтение из памяти выровненных данных происходит быстрее, чем для невыровненных. Т.е. жертвуя некоторым (обычно небольшим) расходом памяти, увеличивается быстродействие программы.
Выравнивание в GCC и MSVC можно задать отличным от дефолтового с помощью #pragma pack. Попробуй сравнить результаты, например, при #pragma pack(1). И да, с "лишними" битами (и байтами) ничего не происходит, - т.е. значения их содержат "мусор", на них нельзя полагаться. Сообщение отредактировал Влад - 23.9.2011, 14:46 |
|
|
AXELman4ever |
![]()
Сообщение
#3
|
Студент ![]() Группа: Участник Сообщений: 31 Регистрация: 22.9.2011 Пользователь №: 2902 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
|
|
|
Алексей1153 |
![]()
Сообщение
#4
|
![]() фрилансер ![]() ![]() ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 2943 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: ![]() ![]() ![]() |
если выравнивание ДЕЙСТВИТЕЛЬНО нужно убрать (а это случаи работы с железом или для точного задания размеров полей структуры по другим причинам), то следует использовать конструкцию
таким образом вернётся предыдущее значение выравнивания В подавляющем же большинстве случаев выравнивание надо оставлять по умолчанию, иначе быстродействие программы может пострадать
по опыту уже знаю, что для каждой отдельной структуры лучше делать отдельные же "скобки" из прагм , то есть не делать прагму сразу для группы структур. Иначе однажды переместишь структуру - и выравнивание пропадёт, так как забудешь к ней прагмы оставить Сообщение отредактировал Алексей1153 - 23.9.2011, 18:35 |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 12.4.2025, 12:03 |