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 pack的n值等于或超過所有數據成員長度的時候,這個n值的大小將不產生任何效果。
總結
 
                            
                        - 上一篇: C语言指针和二维数组
- 下一篇: 对象属性操作函数:hasattr(),g
