(067) 359 -33-27 pridanoe.com.ua

Що робить pragma pack

Що робить pragma pack



Хотілося б дізнатися, що таке #pragma і що робить ця директива



Що таке #pragma? Знаю лише #pragma once і те, що ця штука додається в заголовних файлах, щоб уникнути проблем при повторному підключенні цього файлу.



2 відповіді 2



Директива компілятора Робить багато чого, наприклад, може запускати програму в мультитреді або управляти упаковкою структур пам'яті.



У різних компіляторів вони свої, дивіться документацію на компілятор, щоб дізнатися подробиці.



Це директива, яка може багато і вона сильно компіляторнозалежна. Для студійного компілятора можна прочитати на msdn



мені подобається #pragma comment lib - яка дозволяє передати лінковнику ім'я бібліотеки, яку потрібно підключити при лінковці. Дуже часто буває супер зручно.



113k 6 6 золотих знаків 95 95 срібних знаків 163 163 бронзових знаків

Пов'язані



Подібні



Підписатися на стрічку



Для підписки на стрічку скопіюйте та вставте це посилання у вашу програму для читання RSS.



Site design/logo © 2024 Stack Exchange Inc; user contributions licensed under CC BY-SA . rev 2024.11.26.19268



pack pragma



Вказує вирівнювання упаковки для елементів структури, об'єднання та класу.



Синтаксис



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



Параметри



show
(Необов'язково) Відображає поточне значення байта для вирівнювання упаковки. Значення відображається у попередженні.



push
(Необов'язково) Відправляє поточне значення вирівнювання упаковки у внутрішній стек компілятора та задає поточне значення вирівнювання упаковки на n. Якщо значення вирівнювання упаковки не вказано, надсилається поточне значення вирівнювання упаковки.



pop
(Необов'язково) Видаляє запис із верхньої частини внутрішнього стека компілятора. Якщо значення n не вказано pop значення упаковки, пов'язане з результуючим записом у верхній частині стека, є новим значенням вирівнювання упаковки. встановлено значення n, наприклад #pragma pack(pop, 16) , n стає новим значенням вирівнювання упаковки. identifier , наприклад, всі записи в стеку будуть спливають до тих пір, поки #pragma pack(pop, r1) не буде знайдена запис identifier Цей запис повертається, а значення упаковки, пов'язане з записом, знайденим у верхній частині стека, стає новим значенням вирівнювання упаковки. identifier запис у стеку, pop вона ігнорується.



#pragma pack (pop, r1, 2) Оператор еквівалентний наступному #pragma pack (pop, r1) #pragma pack(2) .



identifier
(Необов'язково) При використанні з push ім'ям призначається запис у внутрішньому стеку компілятора. pop , спливає записи з внутрішнього стека, доки identifier буде видалено. identifier він не знайдений у внутрішньому стеку, нічого не відображається.



n
(Необов'язково) Вказує значення в байтах, яке буде використовуватися для пакування. n за замовчуванням дорівнює 8. Допустимі значення: 1, 2, 4, 8 і 16. Вирівнювання елемента знаходиться на межі, яка є або декількома n або кількома розмірами елемента, залежно від того, що менше.



Зауваження



Щоб упакувати клас, слід помістити його члени безпосередньо один за одним у пам'ять. Це може означати, що деякі або всі елементи можна вирівняти по межі менше, ніж вирівнювання за умовчанням цільової архітектури. pack забезпечує контроль на рівні оголошення даних. Він відрізняється від параметра /Zp компілятора, який надає лише елемент керування на рівні модуля. пакет набирає чинності в першому struct або union class оголошення pragma після того, як він буде помічений. pack не впливає на визначення. pack без аргументів, заданих n у параметрі /Zp компілятора Якщо параметр компілятора не встановлено, значення за замовчуванням – 8 для x86, ARM та ARM64.



При зміні вирівнювання структури він може не використовувати стільки місця в пам'яті.



Щоб отримати додаткові відомості про зміну вирівнювання, див.



У Visual Studio 2015 і пізніших версіях можна використовувати стандартні alignas і alignof оператори, на відміну від __alignof __declspec( align ) них і переносимих між компіляторами. Стандарт C++ не використовує упаковку, тому необхідно використовувати pack (або відповідне розширення для інших компіляторів), щоб вказати вирівнювання менше за розмір слова цільової архітектури.



Приклади



У наступному прикладі показано, як змінити pack Прагма вирівнювання структури.



// pragma_directives_pack.cpp #include struct S < int i; // size 4 double k; // size 8 double k;


У цьому прикладі показано, як використовувати синтаксис push, pop і відображення синтаксису.



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

Схожі записи

 
Моя корзина
Ваша корзина пуста.
Поиск
Выбор валюты
Евро
Рубль
Доллар
Гривна
Вход на сайт
Забыли пароль?
Ещё не зарегистрированы? Записи