1

阅读与我类似的其他问题,我发现大多数人都想知道为什么你需要知道实例的大小,所以我会继续告诉你,尽管这并不是问题的核心。我正在开发一个需要分配数千到数十万个非常小的对象的项目,而对象的默认分配模式根本无法解决。我已经通过创建一个对象池类来解决这个问题,它允许一次性分配和初始化大量对象;释放也可以完美地工作(对象返回到池中)。

它实际上工作得很好,不是我的问题,但我注意到class_getInstanceSize返回异常大的尺寸。例如,一个存储一个size_t和两个(包括isAClass实例变量的类被报告为 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. 同样,这发生在两个运行时。

4

1 回答 1

1

我想我已经解决了这个问题,这可能是有史以来最愚蠢的原因。

我使用的是旧的分析/调试库;事实上,我不知道它的实际名称(库是 libcs​​uomm;它的标头没有识别信息)。我所知道的只是它是 compsci 实验室的计算机上的一个图书馆(我在转学地质学专业之前做了一年的 Comp-Sci,毕业并且永不回头)。

无论如何,该库的重点在于它提供了许多分析和调试功能;我最常使用它的是内存泄漏检测,因为它实际上跟踪每个对象,这与我最喜欢的基于 C 的内存泄漏库(现在不受支持,MSS)不同,它不知道原始分配之外的对象。

因为我调试的时候用的太多了,所以总是想都没想就默认设置好了。因此,即使在创建我的测试项目以尝试查明错误时,我也没有考虑任何想法就设置了它。好吧,事实证明该库通过拉一些运行时技巧来工作,因此它可以正确跟踪对象。现在我禁用了它,事情似乎正常工作,所以我相信它是我问题的根源。

现在我对草率地得出关于它是一个错误的结论感到难过,但当时我在我自己的代码中看不到任何可能导致该问题的东西。

于 2012-12-24T10:24:06.713 回答