Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Какой принцип поправки на байты?
Форум на CrossPlatform.RU > Разработка > С\С++
AXELman4ever
Добрый день.

Как пояснить следующее:

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 байт.

Почему во втором случае идет поправка, а в первом нет?
я так понимаю что поправка идет на размер самого большого типа, но почему так? И что происходит с теми битами, которые "поправились"?

Спасибо.
Влад
Такая штука называется "выравниванием". И связана она с тем, что чтение из памяти выровненных данных происходит быстрее, чем для невыровненных. Т.е. жертвуя некоторым (обычно небольшим) расходом памяти, увеличивается быстродействие программы.
Выравнивание в GCC и MSVC можно задать отличным от дефолтового с помощью #pragma pack. Попробуй сравнить результаты, например, при #pragma pack(1).

И да, с "лишними" битами (и байтами) ничего не происходит, - т.е. значения их содержат "мусор", на них нельзя полагаться.
AXELman4ever
Цитата(Влад @ 23.9.2011, 14:44) *
....
И да, с "лишними" битами (и байтами) ничего не происходит, - т.е. значения их содержат "мусор", на них нельзя полагаться.


Спасибо большое :lol:
Алексей1153
если выравнивание ДЕЙСТВИТЕЛЬНО нужно убрать (а это случаи работы с железом или для точного задания размеров полей структуры по другим причинам), то следует использовать конструкцию

#pragma pack (push,1)

//тут описывается структура

#pragma pack (pop)


таким образом вернётся предыдущее значение выравнивания

В подавляющем же большинстве случаев выравнивание надо оставлять по умолчанию, иначе быстродействие программы может пострадать


#pragma pack (push,1)
struct A
{
   int a;
   int b;
   char c;
};
#pragma pack (pop)

cout << sizeof(A); // 9 байт.



по опыту уже знаю, что для каждой отдельной структуры лучше делать отдельные же "скобки" из прагм , то есть не делать прагму сразу для группы структур. Иначе однажды переместишь структуру - и выравнивание пропадёт, так как забудешь к ней прагмы оставить
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.