32、64位編譯器各型別大小和位元組對齊
32位編譯器:32位系統下指標佔用4位元組
char:1個位元組
char*(即指標變數): 4個位元組(32位的定址空間是2^32, 即32個bit,也就是4個位元組。同理64位編譯器)
shortint :2個位元組
int: 4個位元組
unsigned int: 4個位元組
float: 4個位元組
double: 8個位元組
long: 4個位元組
longlong: 8個位元組
unsigned long: 4個位元組
64位編譯器:64位系統下指標佔用8位元組
char:1個位元組
char*(即指標變數): 8個位元組
shortint :2個位元組
int: 4個位元組
unsigned int: 4個位元組
float: 4個位元組
double: 8個位元組
long: 8個位元組
longlong: 8個位元組
unsigned long: 8個位元組
位元組對齊的細節和具體編譯器實現相關,但一般而言,滿足三個準則:
1) 結構體變數的首地址能夠被其最寬基本型別成員的大小所整除;
2) 結構體每個成員相對於結構體首地址的偏移量都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組;例如上面第二個結構體變數的地址空間。
3) 結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要編譯器會在最末一個成員之後加上填充位元組。
4)結構體作為資料成員的對齊規則:在一個struct中包含另一個struct,內部struct應該以它的最大資料成員大小的整數倍開始儲存
64位編譯器:
Example1:
structA{
longa1;
short a2;
inta3;
int*a4;
};
記憶體大小:sizeof(A)=8+((2+4)+2)+8 =24
注:括號部分填充2個位元組對齊
Example2:
struct B
{
char a;
double b;
int c;
}; 記憶體大小:sizeof(B) = (1+7) + 8+ (4+4) = 24, 注:前部分填充7個位元組補齊,後面填充4個位元組補齊
Example3:
struct C
{
int a,
A b,
char c,
};
記憶體大小:sizeof(C) = (4+4) + 24 + (1+7) = 40, 注:前部分填充4個位元組補齊,後面填充7個位元組補齊