日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

内存对齐原则

發布時間:2023/12/20 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 内存对齐原则 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 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; }

運行結果如下:

之所以會出現上面的結果,是因為結構體存在內存對齊原則,具體原則如下:

  • 每個結構體變量的地址空間為[0,sizeof(S)],而結構體中的第一個成員變量偏移量為0,即從頭開始。
  • 其他成員變量要對齊到某個數字(對齊數)的整數倍地址處,對齊數 = min{編譯器默認對齊數,該成員變量大小},在windows中,編譯器默認對齊數為8;
  • 結構體大小為最大對齊數的整數倍
  • 如果嵌套結構體,則嵌套結構體當成一個普通成員變量處理。
    因此,上面程序中結構體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字節的數據進寄存器,也就是要讀取兩次才能讀到該數據。

    總結

    以上是生活随笔為你收集整理的内存对齐原则的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。