【问题标题】:Have you ever used NSZoneMalloc() instead of malloc()?你有没有使用过 NSZoneMalloc() 而不是 malloc()?
【发布时间】:2010-10-10 05:52:17
【问题描述】:

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

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

你遵循这种做法吗?你用过内存区吗?

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

【问题讨论】:

  • 我也从未真正看到内存区域的好处,所以我很高兴你问了这个问题。

标签: cocoa memory-management history next


【解决方案1】:

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

【讨论】:

  • 所以你基本上是说我不应该问我的问题?
  • +alloc 只返回默认区域中的一个对象,因为它将默认区域传递给 +allocWithZone: 这是 real 分配器。
【解决方案2】:

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

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

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

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

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

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

【讨论】:

  • 我知道你的意思很好,但你的最后一段有点粗鲁。这根本不是我的问题。你假设我只对寻找优化精灵灰尘的魔法感兴趣,并且我没有阅读或理解我链接到的文档。
  • 不,我假设没有这样的事情。我的观点是,区域的唯一目的是让事情变得更快,而且它们永远不会让事情变得足够快,无论出于何种目的,都不足以证明使用它们是合理的。
  • 我不认为彼得试图说这是您的问题,只是在考虑是否使用自定义区域时要问这个问题。在设计过程中问自己是一个反问。
  • @PeterHosey NSZoneFree 是否比免费更好?来自 docs:标准 C 函数 free 的作用相同,但会花时间查找内存属于哪个区域。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2023-03-20
    • 1970-01-01
    • 2018-07-13
    • 2021-08-26
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    相关资源
    最近更新 更多