内存对齐原则
文章目錄
- 1內存對齊原則
- 2 更多例子
- 嵌套結構體
- 類的對齊
- 為什么要對齊
參考: 內存對齊原則
#pragma pack(n)
1內存對齊原則
先看一個例子:
#include<iostream> using namespace std;struct S1 {char c1;char c2;int i1; }; struct S2 {char c1;int i1;char c2; }; int main() {cout <<"sizeof(S1)"<< sizeof(S1)<<endl;cout << "sizeof(S2)"<<sizeof(S2)<<endl;return 0; }運行結果如下:
之所以會出現上面的結果,是因為結構體存在內存對齊原則,具體原則如下:
因此,上面程序中結構體S1的內存分布圖如下:
S2的內存分布圖為:
2 更多例子
嵌套結構體
#include<iostream> using namespace std; struct S1 {double d1;double d2; }; struct S2 {char c1;S1 s1;char c2; }; int main() {cout <<"sizeof(S1):"<< sizeof(S1)<<endl;cout << "sizeof(S2):"<<sizeof(S2)<<endl;return 0; }類的對齊
對于類的某個實例(對象)而言,成員函數、靜態變量都不會占空間,只有成員變量占空間,而只考慮成員變量的類相當于一個結構體,其對齊原則同上:
#include<iostream> using namespace std;class S1 {char c1;char c2;int i1; }; class S2 {static double static_c;//靜態成員char c1;char c2;int i1;int fun1()//成員函數{c1 = 'c';return 0;} }; int main() {S1 s1;S2 s2;cout <<"sizeof(s1):"<< sizeof(s1)<<endl;cout << "sizeof(s2):"<<sizeof(s2)<<endl;return 0; }為什么要對齊
CPU把內存當成一塊一塊的,塊的大小可以是2字節、4字節、8字節等,因此CPU讀取內存時是一塊一塊讀取的,塊的大小成為內存讀取粒度,可以用預編譯指令#pragma pack(n)來設置。
如果內存不對其將會影響CPU的讀取效率,例如:
假設CPU要讀取一個4字節大小的數據到寄存器中(假設內存讀取粒度是4),分兩種情況討論:
1)數據從0字節開始
2)數據從1字節開始
解析:
1)當數據從0字節開始的時候,直接將0-3四個字節完全讀取到寄存器,讀取一次就可以了。
2)當數據從1字節開始的時候,問題很復雜,首先先將前4個字節讀到寄存器,并再次讀取4-7字節的數據進寄存器,接著把0字節,5,6,7字節的數據剔除,最后合并1,2,3,4字節的數據進寄存器,也就是要讀取兩次才能讀到該數據。
總結
- 上一篇: 华硕笔记本电脑突然失去WIFI功能
- 下一篇: 6.openldap客户端安装