Auto-width of ComboBox's content
阿新 • • 發佈:2021-12-09
目錄
為什麼要記憶體對齊
- 硬體原因:有的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
這樣可以充分利用記憶體空間,並解決不同架構下的大小端問題。