crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Какой принцип поправки на байты?
AXELman4ever
  опции профиля:
сообщение 23.9.2011, 13:48
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 31
Регистрация: 22.9.2011
Пользователь №: 2902

Спасибо сказали: 0 раз(а)




Репутация:   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 байт.

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

Спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Влад
  опции профиля:
сообщение 23.9.2011, 14:44
Сообщение #2


Участник
**

Группа: Участник
Сообщений: 146
Регистрация: 20.3.2009
Из: Санкт-Петербург
Пользователь №: 627

Спасибо сказали: 46 раз(а)




Репутация:   8  


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

И да, с "лишними" битами (и байтами) ничего не происходит, - т.е. значения их содержат "мусор", на них нельзя полагаться.

Сообщение отредактировал Влад - 23.9.2011, 14:46
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AXELman4ever
  опции профиля:
сообщение 23.9.2011, 15:23
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 31
Регистрация: 22.9.2011
Пользователь №: 2902

Спасибо сказали: 0 раз(а)




Репутация:   0  


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


Спасибо большое :lol:
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 23.9.2011, 18:30
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


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

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



по опыту уже знаю, что для каждой отдельной структуры лучше делать отдельные же "скобки" из прагм , то есть не делать прагму сразу для группы структур. Иначе однажды переместишь структуру - и выравнивание пропадёт, так как забудешь к ней прагмы оставить

Сообщение отредактировал Алексей1153 - 23.9.2011, 18:35
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 17:10