整數邊界對齊方式 c中結構體邊界對齊

2021-10-13 11:03:39 字數 1265 閱讀 7222

原則1、普通資料成員對齊規則:第乙個資料成員放在offset為0的地方,以後每個資料成員儲存的起始位置要從該成員大小的整數倍開始(比如int在32位機為4位元組,則要從4的整數倍位址開始儲存)。

原則2、結構體成員對齊規則:如果乙個結構裡有某些結構體成員,則該結構體成員要從其內部最大元素大小的整數倍位址開始儲存。(struct a裡存有struct b,b裡有char,int,double等元素,那b應該從8的整數倍開始儲存。)

原則3、結構體大小對齊規則:結構體大小也就是sizeof的結果,必須是其內部成員中最大的對齊引數的整數倍,不足的要補齊。

補 充一點,如果陣列作為結構體成員,比如:char a[3]。它的對齊方式和分別寫3個char是一樣的,也就是說它還是按1個位元組對齊。如果寫: typedef char array3[3];array3這種型別的對齊方式還是按1個位元組對齊,而不是按它的長度3對齊。如果共用體作為結構體成員,則該共用體成員要從其內部 最大元素大小的整數倍位址開始儲存。

例1:struct a;

structb;

sizeof(a) = 6; 這個很好理解,三個short都為2。

sizeof(b) = 8; 這個比是不是比預想的大2個位元組?long為4,short為2,整個為8,因為原則3。

例2:struct a{

int a;

char b;

short c;

struct b{

char b;

int a;

short c;

sizeof(a) = 8; int為4,char為1,short為2,這裡用到了原則1和原則3。

sizeof(b) = 12; 是否超出預想範圍?char為1,int為4,short為2,怎麼會是12?還是原則1和原則3。

深究一下,為什麼是這樣,我們可以看看記憶體裡的布局情況。

a        b   c

a的記憶體布局:1111, 1*,11

b       a       c

b的記憶體布局:1***,1111,11**

其 中星號*表示填充的位元組。a中,b後面為何要補充乙個位元組?因為c為 short,其起始位置要為2的倍數,就是原則1。c的後面沒有補充,因為b和c正好占用4個位元組,整個a占用空間為4的倍數,也就是最大成員int型別 的倍數,所以不用補充。b中,b是char為1,b後面補充了3個位元組,因為a是int為4,根據原則1,起始位置要為4的倍數,所以b後面要補充3個字 節。c後面補充兩個位元組,根據原則3,整個b占用空間要為4的倍數,c後面不補充,整個b的空間為10,不符,所以要補充2個位元組。

結構體邊界對齊

許多實際的計算機系統對基本型別資料在記憶體中存放的位置有限制,它們會要求這些資料的首位址的值是某個數k 通常它為4或8 的倍數,這就是所謂的記憶體對齊,而這個k則被稱為該資料型別的對齊模數 alignment modulus 當一種型別s的對齊模數與另一種型別t的對齊模數的比值是大於1的整數,我們就...

結構體邊界對齊

許多實際的計算機系統對基本型別資料在記憶體中存放的位置有限制,它們會要求這些資料的首位址的值是某個數k 通常它為4或8 的倍數,這就是所謂的記憶體對齊,而這個k則被稱為該資料型別的對齊模數 alignment modulus 當一種型別s的對齊模數與另一種型別t的對齊模數的比值是大於1的整數,我們就...

整數邊界對齊方式 C高階 記憶體對齊

碼字不易,對你有幫助點讚 關注支援一下作者不會程式設計的程式圓看更多乾貨,獲取第一時間更新如果想看比較好看的排版,可以閱讀原文 c高階 四 記憶體對齊 mp.weixin.qq.com 我們這一節主要來講一相關的些比較重要的知識。struct s1 上面是乙個結構體,也是我們自定義的一種型別。我們知...