Громадянам України

Що робить pragma pack push?

#pragma pack(push[, n ]) переміщує поточне налаштування вирівнювання у внутрішній стек, а потім за бажанням встановлює нове вирівнювання. #pragma pack(pop) відновлює налаштування вирівнювання до того, що було збережено у верхній частині внутрішнього стеку (і видаляє цей запис стека).

Директива #pragma pack змінює поточне правило вирівнювання лише для членів структур, чиї оголошення слідують за директивою. Це не впливає безпосередньо на вирівнювання конструкції, але впливаючи на вирівнювання елементів конструкції, це може вплинути на вирівнювання загальної структури.

Директива #pragma pack не може збільшити вирівнювання члена, а навпаки, може зменшити вирівнювання. Наприклад, для елемента з типом даних short директива #pragma pack(1) буде спричинити упаковку цього члена в структуру на 1-байтовій межі, тоді як директива #pragma pack(4) не матиме жодного ефекту.

Прагму можна використовувати в умовній директиві, щоб забезпечити нову функціональність препроцесора. Або використовуйте один, щоб надати компілятору інформацію, визначену реалізацією. Рядок маркерів — це серія символів, що представляють певну інструкцію компілятора та аргументи, якщо такі є.

в принципі, #pragma pack можна емулювати за допомогою атрибутів GCC, але не навпаки, через точніший контроль за допомогою атрибутів. Ось приклад, який можна протестувати на GCC: перше визначення використовує #pragma pack, а друге — атрибути. Схема в обох випадках однакова.

#pragma pack(push[, n ]) надсилає поточне налаштування вирівнювання у внутрішній стек, а потім додатково встановлює нове вирівнювання. #pragma pack(pop) відновлює налаштування вирівнювання до того, що було збережено у верхній частині внутрішнього стеку (і видаляє цей запис стека).