Lua 源代码中的字节对齐
Lua 源码中定义了一个叫 L_Umaxalign
的数据类型:
ctypedef union {
double u;
void *s;
lua_Integer i;
long l;
} L_Umaxalign;
这个结构其实是该平台上最长的数据类型。
然后和 TString
和 Udata
结构定义成一个联合体:
ctypedef union UTString {
L_Umaxalign dummy; /* ensures maximum alignment for strings */
TString tsv;
} UTString;
typedef union UUdata {
L_Umaxalign dummy; /* ensures maximum alignment for 'local' udata */
Udata uv;
} UUdata;
之所以这样处理是因为 TString
和 Udata
其实是一块连续内存区域的头部,后面紧跟实体数据。为了保证访问实体数据时候字节对齐,必须让实体数的起始地址是平台最大数据长度的整数倍。好比 malloc
返回的地址在32位平台上是8的整数倍,在64位平台上是16的整数倍一样。
不过我个人习惯是这样写:
cstruct {
TString tsv;
L_Umaxalign data[];
} UTString;