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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

C内存对齐

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

關于內存對齊的原因有:

1、平臺原因(移植原因):

? ? ? ?不是所有的硬件平臺都能訪問任意地址上的任意數據的;某些硬件平臺只能在某些地址處取某些特定類型的數 ? ? ? ? ? ?據,否則拋出硬件異常。

2、性能原因:

? ? ? ?數據結構(尤其是棧)應該盡可能地在自然邊界上對齊。原因在于,為了訪問未對齊的內存,處理器需要作兩次內 ? ? ? ? 存 ?訪問;而對齊的內存訪問僅需要一次訪問。

??? 內存對齊的概念則是:各種數據類型在空間上按一定規則排列,而不是順序地一個接一個排列。提到一定規則,引入規則之前,先來做個概念解釋:每個特定平臺的編譯器都有一個默認的“對齊系數”,也可叫對齊模數。而這個對齊系數,我們是可以通過代碼來修改的:#pragma pack(n), 其中n就是對齊系數。

內存對齊中按照:1,2,4,8,16進行對齊

下面就引入對齊規則:

??? 1.結構(struct)(或聯合(union))的數據成員,第一個數據成員放在偏移量0的地方,以后每個數據成員的對齊按照#pragma pack(n)指定的數值n和這個數據成員自身長度中,比較小的那個進行。

struct stu{char c1;  //1字節short a1;  //2字節int i1;   //4字節long l1;  //8字節,但是在32位系統是4字節 }; printf("size :%zu\n",sizeof(struct stu));輸出為:16

輸出16;是因為char 是占一個字節的,但是它后面的short是2占字節,所以char后面補1位,int 占4字節,而它前面的2個成員變量剛好是占了4個字節,所以緊接著后面寫入int類型變量,再后面的long類型是占8字節的,而它前面的所有類型之和也是8的倍數,所以也是緊接著寫入long變量。所以輸出16

?2.結構(或聯合)的整體對齊規則:在數據成員完成各自對齊之后,結構(或聯合)本身也要進行對齊,對齊將按照#pragma pack指定的數值和結構(或聯合)最大數據成員長度中,比較小的那個進行。

struct s3 { char a; }; struct s4 { char b; }; struct s5 { s3 _x; s4 _y; int i; }; printf("S5 = %lu\n",sizeof(struct s5));
輸出:8

3.#pragma packn值等于或超過所有數據成員長度的時候,這個n值的大小將不產生任何效果。




總結

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

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