связанные с директивой # pragma - PullRequest
2 голосов
/ 25 марта 2011

Когда я делаю #pragma pack(2) что это значит ???

Ответы [ 4 ]

3 голосов
/ 25 марта 2011

Это означает, что структуры, объединения или классы выровнены по 2 байта. Это означает, что следующая структура будет использовать 3 байта в памяти вместо 2:

struct MyStruct
{
    char Field1;
    char Field2;
};

Следующее будет использовать 4 байта:

struct MyStruct
{
    WORD Field1;
    WORD Field2;
};

Подробнее здесь: http://msdn.microsoft.com/en-us/library/2e70t5y1%28v=vs.80%29.aspx. Важно: Читайте о проблемах и используйте их, только если вы знаете, что делаете, и вам это нужно; -)

1 голос
/ 25 марта 2011

Это директива pragma, специфичная для Visual Studio, которая изменяет порядок выравнивания элементов в struct. Полную информацию можно найти здесь, на MSDN , но суть в том, что она позволяет вам настраивать, сколько отступов размещается между элементами struct. Более плотная упаковка занимает меньше места, но может вызвать проблемы с выравниванием.

0 голосов
/ 25 марта 2011

Что ж, это означает, что каждый член структуры, класса или объединения, объявленный после прагмы, которая следует за первым членом структуры, хранится с кратностью либо размера элемента, либо 2-байтовой границы, в зависимости от того, что меньше.

# pragma pack (n) повлияет на размер структур, классов и союзов, следующих за ним.

если вы используете его на уровне файлов, вероятно, будет хорошей идеей сохранить выравнивание упаковки перед тем, как изменить его и вернуть обратно к его предыдущему значению, когда объявления, которые вы хотите применить, заканчивают новое выравнивание упаковки.

И, конечно, вы должны посмотреть в документации к вашему компилятору.

Для MS VS 6.0: см. Здесь .

0 голосов
/ 25 марта 2011

Это означает, что компилятор должен упаковать элементы struct / class / union так, чтобы они были выровнены по 2-байтовой границе.

struct Foo {
  char c1;
  int i1;
};

С пакетом (2) структура будет иметь:

  • 1 байт для символа
  • 1 неиспользованный байт, заполнение
  • 4 байта (при условии 32-разрядного) для целого

Обратите внимание, что все прагмы являются специфичными для компилятора - эта работает как на VC, так и на gcc.

...