標籤:資料 問題 for linux amp size
這個問題確實比較基礎,些這篇文章為了給自己一個總結,也算是一個筆記記錄,爭取做到最精簡。
結構體對齊關鍵詞:
“對齊係數”(也叫對齊模數):以通過先行編譯命令#pragma pack(n),n=1,2,4,8,16來改變這一係數
“對齊規則”:分兩步,資料成員對齊,整體對齊:
1:資料成員對齊: 按照#pragma pack指定的數值和這個資料成員自身長度中,比較小的那個進行
公式理解為:min( n , sizeof(curr_mem) )
2: 整體對齊:按照#pragma pack指定的數值和結構(或聯合)最大資料成員長度中,比較小的那個進行
公式理解為:min( n , max( sizeof(mem1),sizeof(mem2),sizeof(mem3)......) )
舉例:
2位元組對齊(#pragma pack(2))
結果:sizeof(struct test_t) = 10
分析過程:
資料成員對齊:
#pragma pack(2) struct test_t { int a; /* 長度4 > 2 按2對齊;起始offset=0;存放位置區間[0,3] */ char b; /* 長度1 < 2 按1對齊;起始offset=4;存放位置區間[4] */ short c; /* 長度2 = 2 按2對齊;起始offset=6;存放位置區間[6,7] */ char d; /* 長度1 < 2 按1對齊;起始offset=8;存放位置區間[8] */ }; #pragma pack()
整體對齊:
按照 min( 2 , (max(int,short,char) ) 結果做對齊
記憶體池中的起始地址對齊:
#define NGX_ALIGNMENT sizeof(unsigned long) /* platform word */
#define ngx_align_ptr(p, a) \
(u_char *) (((uintptr_t) (p) + ((uintptr_t) a - 1)) & ~((uintptr_t) a - 1))
調用:ngx_align_ptr(ptr,NGX_ALIGNMENT)
詳細過程不多說,幾個關鍵點:
1: "字" 在電腦系統中的作用(多讀 深入理解電腦)
2: 目前Linux平台,指標類型 與 unsigned long 大小相同