Поделиться через


pack

Задает выравнивание упаковки, структуры, объединения и членов класса.

#pragma pack( [ show ] | [ push | pop ] [, identifier ] , n  )

Заметки

pack предоставляет элемент управления на уровне данные-объявления.Это отличается от параметров компилятора /Zp, который предоставляет элемент управления только на уровне модуля.pack вступает в силу на первое struct" unionили class объявление после прагмы видны.pack не влияет на определениях.Вызов pack без наборов аргументов n значение, установленное в параметре компилятора /Zp.Если параметр компилятора не задан, то по умолчанию используется значение 8.

Если изменить выравнивание структуры, то он не может использоваться как много места в памяти, но можно видеть снижения производительности или даже получить оборудование-произведенное исключение для бесподстроечного доступа.Можно изменять эти расширения функциональности исключения с помощью SetErrorMode.

  • show(необязательно)
    Отображает текущее значение байта упаковки выравнивание.Значение отображается сообщение предупреждения.

  • push(необязательно)
    Сохраняет текущее значение выравнивания упаковки на внутреннем стеке компилятора и устанавливает текущее значение выравнивания для упаковки n.If n не указывает текущее значение выравнивания упаковки помещает.

  • pop(необязательно)
    Удаляет запись из вершины внутреннего стека компилятора.If n не указывает с popзатем значение упаковки, связанное с итоговым записью на вершине стека новое значение выравнивания упаковки.If n определяет, например #pragma pack(pop, 16)" n становится новое значение выравнивания упаковки.Если с извлекаете identifier, например #pragma pack(pop, r1)после этого все записи в стеке не извлекаются до записи, имеющей identifier находит., Что запись извлекается и значение упаковки, связанный с результирующей записью на вершине стека новое значение выравнивания упаковки.Если с извлекаете identifier это не найден в любой записи в стеке, после чего pop игнорирует.

  • identifier (необязательно)
    При использовании с push, присвоити имя для записи во внутреннем стеке компилятора.При использовании с pop, шипучки не будут создавать с помощью внутреннего стека до identifier удаляет; If identifier не удается найти во внутреннем стеке, ничего не получаются.

  • n (необязательный параметр)
    Указывает значение в байтах), используемый для упаковки.Если параметр компилятора /Zp не заданы для модуля значения по умолчанию n 8.Допустимыми значениями являются 1, 2, 4, 8 и 16.Выравнивание члена находится на границе, то кратной n или несколько предложений размера элемента, в зависимости от того, какая из этих величин меньше.

#pragma pack(pop,identifier, n) препроцессора.

Дополнительные сведения об изменении распределения см. в разделах эти разделы.

Пример

Следующий пример показывает использование pack директива pragma, чтобы изменить выравнивание структуры.

// pragma_directives_pack.cpp
#include <stddef.h>
#include <stdio.h>

struct S {
   int i;   // size 4
   short j;   // size 2
   double k;   // size 8
};

#pragma pack(2)
struct T {
   int i;
   short j;
   double k;
};

int main() {
   printf("%d ", offsetof(S, i));
   printf("%d ", offsetof(S, j));
   printf("%d\n", offsetof(S, k));

   printf("%d ", offsetof(T, i));
   printf("%d ", offsetof(T, j));
   printf("%d\n", offsetof(T, k));
}

0 4 8
0 4 6

Следующий пример показывает использование push" popи show синтаксис.

// pragma_directives_pack_2.cpp
// compile with: /W1 /c
#pragma pack()   // n defaults to 8; equivalent to /Zp8
#pragma pack(show)   // C4810
#pragma pack(4)   // n = 4
#pragma pack(show)   // C4810
#pragma pack(push, r1, 16)   // n = 16, pushed to stack
#pragma pack(show)   // C4810
#pragma pack(pop, r1, 2)   // n = 2 , stack popped
#pragma pack(show)   // C4810

См. также

Ссылки

Директивы pragma и ключевое слово __Pragma