crossplatform.ru

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


  Ответ в Какой принцип поправки на байты?
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


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

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



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


Спасибо большое :lol:
Влад Дата 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 байт.

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

Спасибо.
Просмотр темы полностью (откроется в новом окне)
RSS Текстовая версия Сейчас: 28.3.2024, 14:35