1. 程式人生 > 其它 >Auto-width of ComboBox's content

Auto-width of ComboBox's content

目錄

為什麼要記憶體對齊

  • 硬體原因:有的CPU只支援訪問對齊的地址;
  • 效能原因:如果資料存放在未對齊的記憶體空間中,則CPU需要做兩次記憶體訪問,而對齊的記憶體訪問只需要一次。

如何觀察

示例程式碼

#include <stdint.h>
#include <stdio.h>

typedef struct _data_algin_
{
    uint32_t a;
    uint8_t b;
}data_algin_t;

data_algin_t data;

int main(int argc, char const *argv[])
{
    printf("total size:%lx\tmember1 size:%lx\tmember2 size:%lx\n", sizeof(data), sizeof(data.a),sizeof(data.b));

    return 0;
}

執行後的結果

hany@ubuntu:~/lab$ gcc -o data_algin data_algin.c 
hany@ubuntu:~/lab$ ./data_algin 
total size:8    member1 size:4  member2 size:1

可以看到整個結構體變數空間是大於兩個成員變數空間之和的。編譯器對整個結構體變數做了對齊操作。

引入的問題

會降低空間利用率。在執行寫二進位制檔案操作時,會有“空餘”空間,會讓解析方誤解,產生解析偏差。

解決方法

將所有的結構體成員均定義為CHAR 型。

typedef struct _data_algin_
{
    uint8_t a[4];
    uint8_t b;
}data_algin_t;

重新編譯,得到如下結果

hany@ubuntu:~/lab$ ./data_algin 
total size:5    member1 size:4  member2 size:1

這樣可以充分利用記憶體空間,並解決不同架構下的大小端問題。