一个define句子是:
#define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) )
Run Code Online (Sandbox Code Playgroud)
我被告知目的是有点对齐.
我想知道它是如何工作的,提前.
上面的宏只是将大小n与最近的大于或等于sizeof(int)边界对齐.
将值a与最近的大于或等于任意边界对齐的基本算法b是
a按b四舍五入起来,然后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),以这种方式优化它没有多大意义.