c/c++ 编译器内存对齐问题
C語言結構體對齊問題詳解
轉載自:http://blog.csdn.net/tiany524/article/details/6295551
測試環境32位機 WinXP:
編譯器VC6(MS cl.exe ) 和 mingw32-gcc-4.5.2
?
1 結構體數據對齊(沒有#pragma pack()宏定義)
結構體對齊可以總結為三個基本原則
①數據成員對齊規則:
結構體的數據成員中,第一個成員從offset為0的地址開始,以后每一個成員存儲的起始位置為該成員大小的整數倍(在win32中int為32bit也即4字節對齊)
②結構體作為成員:
如果一個結構體1作為另一個結構體2的數據成員,則在結構體2中結構體1要從1內部成員最大的整數倍地址開始存儲。
③結構體的總大小(sizeof):
為該結構體內部最大基本類型的整數倍,不足的要補齊,而不是簡單的所有成員的大小總和。
舉例說明
struct{
short a;
short b;
short c; }A; sizeof(A) = 6;(vc6與gcc相同)
struct{
long a;
short c; }A; sizeof(A) = 8;(vc6與gcc相同),根據原則③
它的內存分配為: a1 a2 a3 a4 , c1 c2 x x(a1為a的第一個字節,x為補齊字節,下同)
struct{
int a;
char b;
short c; }A;
sizeof(A) = 8;
A的內存分配為: a1 a2 a3 a4,?b1 x c1 c2(原則1)
struct{
char a;
int b;
short c; }A1;
sizeof(A1) = 12; (vc6與gcc相同)
A1的內存分配為: a1 x x x, b1 b2 b3 b4, c1 c2 x x
下面是更復雜的情況,結構體作為成員
struct{
int a;
doubl b;
short c; }A; // sizeof(A) = 24 (vc6與gcc相同)
struct{
????char a,b;
int c;
double d;
short e;
struct A h;
}B;
sizeof(B) = 48 //(vc6與gcc相同)
A的內存分布: a1 a2 a3 a4 x x x x, b1 b2 b3 b4 b5 b6 b7 b7, c1 c2 x x x x x x
B的內存分布:a1 b1 x x, c1 c2 c3 c4 , d1 d2 d3 d4 d5 d6 d7 d8, e1 e2 x x x x, A的分布
?
?
2 加入#pragma pack()宏定義)
#pragma pack(1)
上面的AB大小分別為14,30,對應于AB的內存分布,去掉x。
pack(2)時為14,30
pack(4)時為16,36
?
3 結構體的位域
結構體中引入位于是為了壓縮存儲空間。而且位于成員不能單獨計算sizeof。
位域大致有5條基本規則。
① 如果相鄰字段的類型相同,且位寬之和小于該類型的sizeof(), 則可以緊鄰著前一個字段存儲,直到不能在容納位置;
struct{
char a:2;
char b:4;
char c:5; }A; // sizeof(A) = 2
內存分布: a1 a2 x x, b1 b2 b3 b4, c1 c2 c3 c4 c5 x x x,這里每一個代表一個bit,與上一節不同
struct{
int a:2;
int b:3;
int c:3; }A; // sizeof(A) = 4, 參照后面的原則5
?
②如果相鄰字段的類型相同,但是位寬之和大于該類型的sizeof(), 則后面的字段將從新的存儲單元開始存儲,且offset為其類型大小的整數倍;
struct{
char a:6;
char b:3;
char c:3; }A; // sizeof(A) = 2
struct{
int a:20;
int b:20;
int c:3; }A; // sizeof(A) = 8, 同時參照后面的原則5
?
③如果相鄰位域字段類型不同,各編譯器的處理不同,VC6不壓縮,GCC壓縮。
struct{
int a:4;
char b:1;
int c:3; }A;
sizeof(A) = 12, VC6
sizeof(A) = 4, gcc,?壓縮了為什么不是3? 同時參照后面的原則5
?
④如果位域字段之間插入非位域字段,各編譯器的處理不同
struct{
int a:4;
char b;
int c:3; }A;
sizeof(A) = 12, VC6
sizeof(A) = 4, gcc, a1 a2 a3 a4 x x x x ,b1~b8, c1 c2 c3 x x x x x
?
struct{
char a:4;
char b;
char c:3; }A;
sizeof(A) = 3, VC6
sizeof(A) = 3, gcc,
?
⑤整個結構體的總大小為其最寬基本類型的整數倍。
轉載于:https://www.cnblogs.com/Sunlnx/p/3366678.html
總結
以上是生活随笔為你收集整理的c/c++ 编译器内存对齐问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我的人生我做主的短句励志的 命运由自己掌
- 下一篇: [20131014] 出现错误,显示事务