之前有人问过同样的问题:Objective-C Runtime: What to put for size & alignment for class_addIvar? 但是它并没有完全解决。
函数声明如下:
BOOL class_addIvar(Class cls, const char *name, size_t size, uint8_t alignment, const char *types)
用于在Objective-C中创建动态类时添加实例变量。
第四个参数
uint8_t alignment
在苹果文档中有描述:
实例变量的最小对齐字节数为1<<align。实例变量的最小对齐方式取决于ivars类型和机器架构。对于任何指针类型的变量,传递log2(sizeof(pointer_type))。
在一些教程中,只要求如果ivar是指针类型,则应使用 log2(sizeof(pointer_type))
;如果ivar是值类型,则应使用 sizeof(value_type)
。但是为什么?有人能详细解释一下吗?
log2(_Alignof(type))
。原因是在class_addIvar
函数内部,它会通过进行1 << alignment
操作来调整对齐方式。 - Richard J. Ross III