結構體內存對齊
試試運行下面的例子
#include <stdio.h>
#include <stdlib.h>using namespace std;struct A{char c;int i;
};struct B{char c; int i; double d;
};struct C{char c;int i;double d;char c1;
};int main(){printf("sizeof(A): %d\n", sizeof(struct A));printf("sizeof(B): %d\n", sizeof(struct B));printf("sizeof(C): %d\n", sizeof(struct C));system("pause");return 0;
}
以上輸出的結果并非實際成員占用的字節數,這就是結構體的內存對齊!
結構體內存對齊原因
1.移植原因
“不是所有的硬件平臺都能訪問任意地址上的任意數據;某些硬件平臺只能在某些特定地址處取某些特定的數據,否則就會拋出硬件異常”。也就是說在計算機在內存讀取數據時,只能在規定的地址處讀數據,而不是內存中任意地址都是可以讀取的。
- 效率原因
正是由于只能在特定的地址處讀取數據,所以在訪問一些數據時,對于訪問未對齊的內存,處理器需要進行兩次訪問;而對于對齊的內存,只需要訪問一次就可以。 其實這是一種以空間換時間的做法,但這種做法是值得的。
結構體對齊規則
1.第一個成員在結構體變量偏移量為0 的地址處,也就是第一個成員必須從頭開始。
2.其他成員變量要對齊到某個數字(對齊數)的整數倍的地址處。對齊數為編譯器默認的一個 對齊數與該成員大小中的較小值。vs中默認值是8 Linux默認值為4(可以通過#pragma pack (N) 修改,使用#pragma pack(show) 可以查看對齊值),但修改時N的取 值只能設置成1, 2,4,8,16.
3.結構體總大小為最大對齊數的整數倍。(每個成員變量都有自己的對齊數)
4.如果嵌套結構體,嵌套的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是 所有最大對齊數(包含嵌套結構體的對齊數)的整數倍
結構體對齊示例