Zhu*_*gqi 3 objective-c objective-c-runtime
之前有人问过同样的问题:Objective-C运行时:为class_addIvar的大小和对齐放什么? 但它还没有完全解决.
函数声明如下:
BOOL class_addIvar(Class cls, const char *name, size_t size, uint8_t alignment, const char *types)
Run Code Online (Sandbox Code Playgroud)
用于将实例变量添加到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).但为什么?有人可以详细解释一下吗?
如果你真的想要了解这些值来自何处,你需要查看体系结构特定的ABI引用,对于OSX和iOS,它们可以在这里找到:OS X,iOS.
每个文档都应该有一个标题为"数据类型和数据对齐"的部分,这有助于解释特定体系结构的这些值.
在实践中,从C11开始,您可以使用_Alignof运算符让编译器为特定类型提供正确的值(因为它已经需要知道这一点以生成正确的机器代码),因此您可以创建class_addIvar类似于这个:
class_addIvar(myClass, "someIvar", sizeof(int), log2(_Alignof(int)), @encode(int))
Run Code Online (Sandbox Code Playgroud)
哪个应该为您处理基础类型的所有血腥细节.
| 归档时间: |
|
| 查看次数: |
541 次 |
| 最近记录: |