你曾经使用过NSZoneMalloc()而不是malloc()吗?

时间:2009-02-27 01:49:21

标签: cocoa memory-management history next

Cocoa提供了它调用Memory Zones的页面对齐的内存区域,并提供了一些以区域作为参数的内存管理函数。

假设您需要分配一块内存(不是用于对象,而是用于任意数据)。如果您调用malloc(size),缓冲区将始终在默认区域中分配。但是,除了默认值之外,有人可能已使用allocWithZone:在另一个区域中分配您的对象。在这种情况下,使用NSZoneMalloc([self zone], size)似乎更好,它可以将缓冲区和拥有对象保存在同一内存区域中。

你遵循这种做法吗?你有没有使用过记忆区?

更新:我认为Stack Overflow倾向于通过关于过早优化的讲座来回答有关低级主题的问题。据我所知,1993年NeXT硬件上的区域可能比现在更重要,谷歌搜索很清楚,几乎没有人关心它们。无论如何,我要问的是,有人可以描述一个他们使用记忆区的项目。

3 个答案:

答案 0 :(得分:2)

我已经为Linux上的NeXTStep,GNUstep和Mac OS X上的Cocoa编写了软件,并且从未需要使用自定义内存区域。表明它对软件的良好改进的条件要么从未出现过,要么从未被发现过。

答案 1 :(得分:1)

在整个问题中你是完全正确的,但在实践中,没有人真正使用区域。当您链接到的页面放置它:

  

在大多数情况下,使用默认区域比创建单独区域更快,更有效。

制作自己的区域的好处是:

  

如果在尝试访问其中一个对象时发生页面错误,则加载页面会带来所有相关对象,这可能会显着减少将来页面错误的数量。

如果发生页面错误,这意味着系统最近正在分页,因此无论如何都很慢,并且您的应用程序不负责任或解决方案是在您的应用程序中同时分配了太多内存的部分首先。

所以,基本上,问题是“你能证明你确实需要创建自己的区域来解决性能问题或者让你的应用程序变坏”,答案是“不”。

答案 2 :(得分:0)

如果你发现自己这样做,你的运作水平可能比你真正应该的水平低。子系统几乎忽略了它们;任何对+alloc等的调用都会让您获得默认区域中的对象。您需要知道mallocNSAllocateCollectable