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) препроцессора.
Дополнительные сведения об изменении распределения см. в разделах эти разделы.
Примеры выравнивания структуры (только для x64)
Пример
Следующий пример показывает использование 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