class_addIvar 的对齐方式在 Objective-C 中有什么作用?

What does class_addIvar's alignment do in Objective-C?

之前有人问过同样的问题: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中动态创建的class。

Apple 文档中描述了第四个参数 uint8_t alignment

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)。但为什么?有人可以详细解释一下吗?

如果您真的想了解这些值的来源,您需要查看特定于体系结构的 ABI 参考,对于 OSX 和 iOS,它们可以在这里找到:OS X, iOS.

这些文档中的每一个都应该有一个标题为 'Data Types and Data Alignment' 的部分,这有助于解释特定体系结构的这些值。

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

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

它应该为您处理底层类型的所有那些血淋淋的细节。