1. 同個結構體佔用內存可變化
在 C語言之結構體 章節裏,對struct的功能和使用進行了詳細的說明。「內存對齊」章節作爲struct的一個擴充知識。事實也證明,實際開發中,關注結構體內存佈局特性的同事寥寥無幾。甚至某些同事表示從未去留意過聲明的結構體所佔用內存空間大小,他們會感到詫異、驚訝,爲何聲明的是同一個結構體數據類型,但是當成員列表位置排列順序進行了細微的調整(數據類型相同,成員數量保持不變)之後,佔用的內存空間卻不相同。有這些疑惑的同事,我相信你在閱讀完本節內容之後,定會茅塞頓開,解開你內心的疑惑。
請讓我們以聲明的兩個結構體數據類型 struct a 和 struct b 作爲拉開本節的序幕。當這兩個結構體數據類型出現在你眼前時候,你是否能夠第一時間裏快準狠地說出你腦海中的答案,並能夠確保它是正確無誤的。
struct a
{
char c;
int i;
short s;
};
struct b
{
int i;
char c;
short s;
};
很顯然,這兩個數據類型裏除了成員列表的排列順序有所不同外,並無任何其他差異。作爲選擇題,毫無疑問它只有3個待選答案:
[1] 數據類型「struct a」佔用內存空間大於數據類型「struct b」
[2] 數據類型「struct a」佔用內存空間等於數據類型「struct b」
[3] 數據類型「struct a」佔用內存空間小於數據類型「struct b」
無論你的答案是[1],還是[2],又或許是[3],都暫時擱置片刻,因爲此刻我並不着急你給出迴應。與其匆忙中給出答案,我更希望的是答案推導的過程。數據類型「struct a」和 數據類型「struct b」之間的內存佔用關係究竟如何?讓我們帶着這個問題繼續往下走。
2. 結構體內存佈局
WIKI 中強調:
The C struct directly references a contiguous block of physical memory, usually delimited (sized) by word-length boundaries. The contents of a struct are stored in contiguous memory.
即結構體(struct)數據類型中各成員列表佔用連續內存空間。現在對上面的數據類型「struct a」和 數據類型「struct b」中各成員分別在內存中的位置作一個分析。
所有的代碼運行結果信息都是基於以下環境:
操作系統: CentOS Linux release 7.5.1804 (Core)
CPU型號: Intel® Xeon® CPU E3-1225 v3 @ 3.20GHz
CPU核數: cpu cores : 4
既然結構體中各成員所佔用的內存空間是連續的,那麼姑且畫出其
#include <ucontext.h>
#include <stdio.h>
struct a
{
char c;
int i;
short s;
};
struct b
{
int i;
char c;
short s;
};
int main()
{
printf("sizeof(struct a) = %lu\n", sizeof(struct a));
printf("sizeof(struct b) = %lu\n", sizeof(struct b));
return 0;
}
打印結果:
sizeof(struct a) = 12
sizeof(struct b) = 8
3. 何爲「內存對齊」
3.1 爲何需要「內存對齊」
4.
落下帷幕