以前一直以爲字節對齊是個癥結,平時的實際應用中接觸的太多了,若是不去弄懂它,感受它就是一個短板,因而着手開始研究了它,今天在公司的例行講解中又講到了這個,回來想一想仍是整理下,算是給一個總結概括。
首先我不得不提一個預編譯命令 #pragma pack(),爲了更好的切入主題我暫且只關心#pragma pack(n)這種設置當前字節對齊值爲n的用法,有一點必須注意,n只有等於1,2,4,8,16纔是有效值,其它的設置都是無效的。
下面,我從結構體入手,先看一段代碼佈局
#include <stdio.h> #pragma pack (1) struct stu1 { int b; }; #pragma pack () struct stu2 { char a; struct stu1 b; }; int main() { printf("sizeof(struct stu1)=%d\nsizeof(struct stu2)=%d\n", sizeof(struct stu1),sizeof(struct stu2)); return 1; }
運行結果
1. 結構體內部,每一個變量至關於結構體首地址的偏移量的大小必須是這個變量類型的有效字節對齊值的整數倍。
2. 結構體自身,結構體分配內存的大小必須是結構體有效字節對齊值的整數倍。
好了,弄清楚了這些概念,咱們再開始看一段程序,來驗證一下這些結論
spa
#include <stdio.h> #pragma pack (2) struct stu1 { char a; int b; }; #pragma pack () struct stu2 { char a; int b; }; int main() { printf("sizeof(struct stu1)=%d\nsizeof(struct stu2)=%d\n", sizeof(struct stu1),sizeof(struct stu2)); return 1; }
分析
變量 a b
stu1內存佈局 *0 ****
code
stu2內存佈局 *000 **** (*表示a、b的實際值,0表示爲了字節對齊補的0值)內存