gpt4 book ai didi

objective-c - NSMutableArray arrayWithCapacity - 分配了多少内存?

转载 作者:行者123 更新时间:2023-12-04 02:49:43 25 4
gpt4 key购买 nike

我是 Objective C 新手(具有 C++ 背景)。我想知道使用 arrayWithCapacity 在这里实际上预留了多少内存。我还没有告诉它我要在数组中放入什么类型的对象。

例如,如果我要存储 200 个 NSString,每个 NSString 包含 200 个字符,它们在内存中是连续的吗?如果是这样,存储 200 个 bool 值会浪费大量内存吗?

我希望你能明白我的意思。我确信在我更多地使用 Objective C 后我会找到答案,但这与我现在正在从事的项目相关。因此,如果有人能解释一下,我将不胜感激。谢谢!!

最佳答案

NSArray 不会在您的示例中存储字符串本身。它存储指向字符串的指针。 arrayWithCapacity 分配至少足够的存储空间来存储这 200 个指针。但这也不意味着 200*sizeof(pointer) 。 NSArray 不 promise 连续存储。它可以以任何它喜欢的方式存储它的指针,如果它愿意的话,它可以改变主意并在运行时重新组织自己。因此它分配的“足够多,以至于在添加 200 个对象之前它不需要增长。”

如果您想探索底层数据结构的当前详细信息(可能会发生变化),请参阅 CFArray source code 。如果您想对 NSArray 性能主题进行更多讨论,请参阅 Array来自鱼。

另外一个小问题是,在某些情况下,字符串足够短,可以直接编码到指针本身中。 (这也适用于数字。)请参阅 Tagged Pointer Strings Mike Ash 对此做了很好的介绍。所以有时指针是整个对象,没有分配其他任何东西。

基本上,您从 C++ 获得的许多直觉并不适用于 Cocoa。 C++ 鼓励您仔细思考事物是如何在幕后实现的。 Cocoa 鼓励您只编写 API,并相信 Apple 会使其在其平台上的最常见用例中发挥出色的性能。如果你试图对苹果公司进行事后批评,那么当底层实现发生变化时,你很容易会被烧伤。 (当然,有时您必须深入研究细节来解决性能问题;只是并不像 C++ 中那样在每个阶段都鼓励这样做。)

关于objective-c - NSMutableArray arrayWithCapacity - 分配了多少内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37753524/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com