3

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

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

你遵循这种做法吗?你有没有使用过内存区域?

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

4

3 回答 3

2

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

于 2009-02-27T07:54:08.800 回答
1

您在整个问题中都是绝对正确的,但实际上,没有人真正使用区域。正如您链接到的页面所说:

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

建立自己的区域的好处是:

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

如果发生页面错误,则意味着系统最近正在分页,因此无论如何都很慢,并且要么您的应用程序不负责,要么解决方案在您的应用程序的一部分中,该部分首先分配了过多的内存地方。

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

于 2009-02-27T02:33:48.477 回答
0

如果你发现自己在这样做,那么你的操作水平可能比你真正应该的水平低。子系统几乎忽略了它们;任何对等的调用+alloc都会让您在默认区域中获得对象。malloc并且NSAllocateCollectable是您需要知道的所有内容。

于 2009-02-27T02:11:16.283 回答