这个问题确实比较基础,些这篇文章为了给自己一个总结,也算是一个笔记记录,争取做到最精简。
结构体对齐关键词:
“对齐系数”(也叫对齐模数):以通过预编译命令#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 大小相同
由内存池实现总结内存对齐问题