預處理之 pragma pack n 的理解

2021-10-05 10:08:15 字數 857 閱讀 5133

編譯器中提供了#pragma pack(n)來設定變數以n位元組對齊方式。n位元組對齊就是說變數存放的起始位址的偏移量有兩種情況:第

一、如果n大於等於該變數所占用的位元組數,那麼偏移量必須滿足預設的對齊方式,第

二、如果n小於該變數的型別所占用的位元組數,那麼偏移量為n的倍數,不用滿足預設的對齊方式。結構的總大小也有個約束條件,分下面兩種情況:如果n大於所有成員變數型別所占用的位元組數,那麼結構的總大小必須為占用空間最大的變數占用的空間數的倍數;否則必須為n的倍數。

1.如果沒有使用#pragma pack的話,對齊規則直接按結構體的基本對齊規則(①以第乙個成員變數存在offset為0的位置,之後每個成員變數的起始位址的偏移量都是自己資料型別長度的整數倍;②結構體總大小要等於最大成員資料型別長度的整數倍

2.如果有#pragma pack(n)限制的話,規則如下:

①.對成員變數的對齊的影響:

如果n大於成員變數的大小,則按成員變數的大小的整數倍偏移,如果n小於成員變數的大小,那麼按n的值偏移

②.對結構體整體大小的影響:

如果n大於所有成員變數的資料型別長度,那麼按成員中最大的資料型別值對齊,如果n比成員變數最大的資料型別值小,那麼按n的長度來對齊。

根據注釋細品一下應該可以明白:

#include #pragma pack(4)

struct node;

int main()

最後該結構體(struct)在記憶體(memory)中的排列(laid out)如圖:

C 之預處理

預處理是指在進行程式編譯的第一遍掃瞄 詞法掃瞄和語法分析 之前所做的工作。預處理是c語言乙個重要功能,它由預處理程式負責完成。當對乙個原始檔進行編譯時,系統將自動引用預處理程式對源程式中的預處理部分進行處理,處理完畢自動進入對源程式的編譯。預處理程式 預處理器 包含在編譯器中。預處理程式首先讀原始檔...

Grunt之預處理

grunt的註冊任務函式本身會對傳入的引數和配置物件裡的相關屬性進行一定的預處理,方便任務函式進行操作。grunt的registertask方法和registermultitask方法會進行不同的預處理。grunt命令通過grunt taskname arg1 arg2形式的指令碼來傳入引數。gru...

C C 預處理之 define

define 是 c c 中的一條預處理指令,用在一行的開始表示乙個預處理指令的開始 一條預處理指令以回車作為結束符,而不是以分號,分號會被替換掉。define m 4 把 m 定義為 4 define max a,b a b a b 定義表示式,而不是定義函式。所有的 define 預處理都只是起...