之前有人问过同一个问题: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
在Apple的文档中有描述:
The instance variable's minimum alignment in bytes is 1<<align. The minimum alignment of an instance variable depends on the ivar's type and the machine architecture. For variables of any pointer type, pass log2(sizeof(pointer_type))
。
在一些教程中,它只声称如果ivar是指针类型,我应该使用log2(sizeof(pointer_type))
;如果ivar是值类型,我应该使用sizeof(value_type)
。但为什么?有人可以详细解释这个吗?
答案 0 :(得分:5)
如果您真的想了解这些值的来源,您需要查看针对特定于体系结构的ABI引用,对于OSX和iOS,可以在此处找到它们:OS X,iOS。
每个文档都应该有一个标题为“数据类型和数据对齐”的部分,这有助于解释特定体系结构的这些值。
实际上,从C11开始,您可以使用_Alignof
运算符让编译器为特定类型提供正确的值(因为它需要知道这一点才能生成正确的机器代码),所以你可以创建一个看起来像这样的class_addIvar
:
class_addIvar(myClass, "someIvar", sizeof(int), log2(_Alignof(int)), @encode(int))
哪个应该为你处理基础类型的所有细节。