class_addIvar在Objective-C中的对齐方式是什么?

时间:2015-10-17 09:10:43

标签: objective-c objective-c-runtime

之前有人问过同一个问题: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)。但为什么?有人可以详细解释这个吗?

1 个答案:

答案 0 :(得分:5)

如果您真的想了解这些值的来源,您需要查看针对特定于体系结构的ABI引用,对于OSX和iOS,可以在此处找到它们:OS XiOS

每个文档都应该有一个标题为“数据类型和数据对齐”的部分,这有助于解释特定体系结构的这些值。

实际上,从C11开始,您可以使用_Alignof运算符让编译器为特定类型提供正确的值(因为它需要知道这一点才能生成正确的机器代码),所以你可以创建一个看起来像这样的class_addIvar

class_addIvar(myClass, "someIvar", sizeof(int), log2(_Alignof(int)), @encode(int))

哪个应该为你处理基础类型的所有细节。