目錄
- 前言
- 成員排布
- 記憶體對齊
- 指針偏移量
- 小結
主要記錄結構體設計經驗。
主要以 C,32bit 裝置為基礎。
李柱明部落格:https://www.cnblogs.com/lizhuming/p/15486826.html
目的:
- 處理記憶體對齊,合理利用記憶體,可以提高空間使用率。
原理:
- 按位元組對齊的方式存儲:即以結構體成員中占記憶體最多的資料類型所占的位元組數為标準,所有的成員在配置設定記憶體時都要與這個長度對齊。
- 注意:如果一行中剩下的空間不足以填充某成員變量,則該成員變量在配置設定記憶體時另起一行配置設定來對齊。而不是每個變量都必須以 N 位元組對齊。
技巧:
- 參考位元組對齊方式,合理排布結構體成員。
例子:
- 按 int,4 位元組對齊。
-
的 size 大小為 12。struct testA_t dataA;
-
的 size 大小為 8。struct testA_t dataB;
# include <stdio.h>
struct testA_t
{
char a;
int b;
char c;
}dataA;
struct testB_t
{
char a;
char c;
int b;
}dataB;
int main(void)
{
printf("%p, %p, %p\n", &dataA.a, &dataA.b, &dataA.c); //%p是取位址輸出控制符
printf("%d\n", sizeof(dataA));
printf("%p, %p, %p\n", &dataB.a, &dataB.b, &dataB.c); //%p是取位址輸出控制符
printf("%d\n", sizeof(dataB));
return 0;
}
- 加快通路資料成員的速度。
- 如果資料成員相對于結構體或類開頭的偏移量小于 128 位元組,則該偏移量可以使用 8 位有符号的數字來表示。
- 即是可以通過編碼為 8 位有符号數字的偏移量來通路,或者根本不需要偏移量。
- 如果相對于結構體或類的開頭的偏移量是 128 位元組或更多,那麼偏移量必須表示為一個 32 位數字(指令集在 8 位到 32 位之間沒有偏移量)。
- 建議在結構或類聲明中,大數組和其他大對象排在最後,最常用的資料成員排在前面。
- 如果不能在前 128 個位元組内包含所有資料成員,則将最常用的成員放在前 128 個位元組中。
- 注意記憶體對齊;
- 128 是個檻,常用的資料成員可考慮放在前 128 位元組中,不常用的或大的資料成員可考慮放在後面;
- 注重性能優化的同時也需要權衡一下代碼的可讀性。