阅读与我类似的其他问题,我发现大多数人都想知道为什么你需要知道实例的大小,所以我会继续告诉你,尽管这并不是问题的核心。我正在开发一个需要分配数千到数十万个非常小的对象的项目,而对象的默认分配模式根本无法解决。我已经通过创建一个对象池类来解决这个问题,它允许一次性分配和初始化大量对象;释放也可以完美地工作(对象返回到池中)。
它实际上工作得很好,不是我的问题,但我注意到class_getInstanceSize
返回异常大的尺寸。例如,一个存储一个size_t
和两个(包括isA
)Class
实例变量的类被报告为 40-52 字节大小。我给出了一个范围,因为class_getInstanceSize
多次调用,即使是连续调用,也不能保证返回相同的大小。事实上,每个对象NSObject
似乎都报告了与它们应有的大小相去甚远的随机大小。
作为测试,我尝试了:
printf("Instance Size: %zu\n", class_getInstanceSize(objc_getClass("MyClassName"));
那行代码总是返回一个值,该值与我手动计算的正确大小相对应。例如,前面的例子是 12 字节(32 位)和 24 字节(64 位)。
考虑到运行时可能在幕后做一些需要更多内存的事情,我观察了每个对象的实际内存使用情况。对于给出的示例,唯一读取或写入的内存在我计算为预期大小的 12/24 字节块中。
class_getInstanceSize
在 Apple 和 GNU 2.0 运行时都这样。那么是否存在class_getInstanceSize
导致这种行为的已知错误,或者我是否在做一些根本错误的事情?在你责怪我的对象池之前;我在一个全新的项目中尝试了同样的测试,使用传统的alloc
类方法和class_createInstance(self, 0);
在自定义类方法中分配对象。
我之前忘记提到的两件事:我几乎完全在我自己的自定义类上对此进行了测试,所以我知道这个诡计不在于该类实际上是一个类集群或任何废话;其次,class_getInstanceSize([MyClassName class])
很少class_getInstanceSize(self) \\ Ran inside a class method
产生相同的结果,尽管两者都只是简单地引用isA
. 同样,这发生在两个运行时。