C資料型別對齊規則包含位域

2021-09-30 09:32:18 字數 614 閱讀 4695

c資料型別對齊規則包含位域

#pragma pack(n) 設定為n位元組對齊

#pragma pack(push) 儲存當前的對齊位元組數

#pragma pack(pop) 還原預設對齊位元組數

vc預設8位元組對齊

1.對於結構體的各個成員,第乙個成員位於偏移為0的位置

2.對於結構體的以後的每個成員的開始偏移位置必須是min(#pragma pack()指定的數,這個資料成員的自身長度)的倍數

3.資料成員對齊完畢後,結構體或聯合本身也要對齊,對齊按照pragma指定的數和結構體中最大資料成員長度中比較小的那個的倍數

有位域的對齊規則:

1.如果相鄰位域字段型別相同,且其位寬之和小於型別的sizeof大小,則後面的字段將緊鄰前乙個字段儲存,直到不能容納為止

2.如果相鄰位域字段型別相同,但其位寬之和大於型別的sizeof大小,則後面的字段將從新的儲存單元開始,其偏移量為其型別大小

的整數倍

3.如果相鄰的位域字段的型別不同,則各編譯器的具體實現有差異,vc6採取不壓縮的方式,devc++採取壓縮方式

4.如果位域字段之間穿插著非位域字段,則不進行壓縮

5.整個結構體的總大小為最寬基本型別成員大小的整數倍

結構體對齊規則及位域規則

讓我們看看下面兩個 struct s1 struct s2 int main printf d n sizeof struct s1 printf d n sizeof s1 printf d n sizeof struct s2 system pause return0 得出的結果會不會是一樣的呢...

C和C 資料型別未對齊

自己定義了乙個結構,寫了乙個dll返回這個結構的資料,結果一直出現錯誤,後來把vs2005的所有異常開啟,報出了data misalignment的錯誤,查了查對我也沒什麼幫助。只是猜想記憶體對齊的問題。但我的結構的定義是3個指標,那就是3個機器字,這樣來看是沒問題的,不存在記憶體為對齊。後來寫程式...

C 資料型別 32位程式

c 資料型別 32位程式 資料型別 位元組 數取值範圍 char 1 128 到126 unsigned char 1 0到255 short 2 32,768 到32,767 unsigned short 2 0到65,535 long 4 2,147,483,648 到2,147,483,648...