保证位对齐的sizeof工具

Lia*_*gyu 2 c sizeof

一个define句子是:

#define _INTSIZEOF(n)   ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
Run Code Online (Sandbox Code Playgroud)

我被告知目的是有点对齐.
我想知道它是如何工作的,提前.

AnT*_*AnT 9

上面的宏只是将大小n与最近的大于或等于sizeof(int)边界对齐.

将值a与最近的大于或等于任意边界对齐的基本算法b

  1. 除以ab四舍五入起来,然后
  2. b再次乘以商.

在无符号(或仅为正)值的域中,第一步是通过以下流行技巧实现的

q = (a + b - 1) / b
// where `/` is ordinary C-style integer division (rounding down)
// Now `q` is `a` divided by `b` rounded up
Run Code Online (Sandbox Code Playgroud)

结合第二步,我们得到以下结论

aligned_a = (a + b - 1) / b * b
Run Code Online (Sandbox Code Playgroud)

aligned_a你得到所需的对齐值.

将此算法应用于手头的问题,可以得到以下_INTSIZEOF宏的实现

#define _INTSIZEOF(n)\
  ( (sizeof(n) + sizeof(int) - 1) / sizeof(int) * sizeof(int) )
Run Code Online (Sandbox Code Playgroud)

这已经足够了.

但是,如果您事先知道对齐边界是2的幂,则可以通过使用简单的按位运算替换除法+乘法序列来"优化"计算

aligned_a = (a + b - 1) & ~(b - 1)
Run Code Online (Sandbox Code Playgroud)

这正是在_INTSIZEOF宏的上述原始实现中所做的.

对于某些编译器来说,这种"优化"可能是有意义的(尽管我希望现代编译器能够自己解决它).但是,考虑到上面的_INTSIZEOF(n)宏显然是用作编译时表达式(它不依赖于任何运行时值,禁止传递的VLA对象/类型n),以这种方式优化它没有多大意义.