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...