Lua 源代码中的字节对齐

Lua 源码中定义了一个叫 L_Umaxalign 的数据类型:

ctypedef union { 
  double u; 
  void *s; 
  lua_Integer i; 
  long l; 
} L_Umaxalign;

这个结构其实是该平台上最长的数据类型。

然后和 TStringUdata 结构定义成一个联合体:

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;

之所以这样处理是因为 TStringUdata 其实是一块连续内存区域的头部,后面紧跟实体数据。为了保证访问实体数据时候字节对齐,必须让实体数的起始地址是平台最大数据长度的整数倍。好比 malloc 返回的地址在32位平台上是8的整数倍,在64位平台上是16的整数倍一样。

不过我个人习惯是这样写:

cstruct {
  TString tsv;
  L_Umaxalign data[];
} UTString;