天天看點

【程式設計技巧】C結構體設計技巧

目錄

  • 前言
  • 成員排布
    • 記憶體對齊
    • 指針偏移量
    • 小結

主要記錄結構體設計經驗。

主要以 C,32bit 裝置為基礎。

李柱明部落格:https://www.cnblogs.com/lizhuming/p/15486826.html

目的:

  • 處理記憶體對齊,合理利用記憶體,可以提高空間使用率。

原理:

  • 按位元組對齊的方式存儲:即以結構體成員中占記憶體最多的資料類型所占的位元組數為标準,所有的成員在配置設定記憶體時都要與這個長度對齊。
  • 注意:如果一行中剩下的空間不足以填充某成員變量,則該成員變量在配置設定記憶體時另起一行配置設定來對齊。而不是每個變量都必須以 N 位元組對齊。

技巧:

  • 參考位元組對齊方式,合理排布結構體成員。

例子:

  • 按 int,4 位元組對齊。
  • struct testA_t dataA;

    的 size 大小為 12。
  • struct testA_t dataB;

    的 size 大小為 8。
# 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 位元組中,不常用的或大的資料成員可考慮放在後面;
  • 注重性能優化的同時也需要權衡一下代碼的可讀性。