【问题标题】:C-Struct vs ObjectC-结构与对象
【发布时间】:2014-05-14 14:58:32
【问题描述】:

我目前正在为 iPhone 开发 Conway 的 Game of Life 模拟器,我有一些关于内存管理的问题。请注意,我使用的是 ARC。
对于我的应用程序,我将需要大量的 C 风格 structs 或 Objective-C 对象来表示单元格。可能有几千个,所以很明显,内存管理浮现在脑海中。
Structs 我对结构的论点是单元格不需要典型的 OO 属性。他们将持有的唯一东西是两个BOOL 值,因此这些单元不会占用大量内存。另外,我需要使用一个二维数组。使用结构,我可以使用 C 风格的二维数组。据我所知,在 Objective-C 中没有替代品。我觉得只为两个布尔值创建一个对象是矫枉过正的。
Objective-C 对象 我的论点(以及大多数其他人的论点)是围绕 Objective-C 对象的内存管理使用 ARC 非常简单和高效。此外,我还看到struct 对对象的内存减少不是那么大的论点。

所以,我的问题。我应该选择老式、精简且兼容二维数组structs 吗?或者我应该坚持使用典型的 Objective-C 对象并冒使用额外内存的风险。

事后思考:如果您推荐 Objective-C 对象,请提供一种表示二维数组的替代存储方法。这很关键,也是使用 Objective-C 对象的最大缺点之一。
谢谢。

【问题讨论】:

  • 简单地使用一个整数的位域,你可以用 NSNumber 包装它来表现得像一个objective-c对象。和一个忠告。 Apple 的指导方针是,您应该坚持使用最高级别的抽象,并且只有在遇到性能问题时才进行优化或返回到较低级别。根据我的真实经验,在尝试之前过于担心性能有时会浪费很多时间。
  • @nsuinteger 然后我在包装 objc 类时丢失了二维数组。这是使用原始二维数组的优势之一。
  • +1 并感谢您提出问题并考虑权衡,无论如何。我在下面回答的想法。 -RP
  • 供将来参考 SomeObject *item = someArray[row][col]; 在 Objective-C 中是完全有效的语法,前提是 rowcol 是整数值,而 someArray 是 rowArrays 的 NSArray,其中每个 rowArray 是SomeObjects 的 NSArray。

标签: ios objective-c arrays memory-management struct


【解决方案1】:

“过早的优化是万恶之源”...如果您尝试构建一个有 100,000 名用户同时玩的 Game of Life 服务器,那么内存占用可能很重要。对于任何现代设备上的单人实现,即使是移动设备,内存大小都是相当学术的。 因此,无论是让游戏以最快的速度启动和运行,还是(更好地)使代码更具可读性和可维护性,都可以做任何事情。人类周期的成本高于计算机周期。假设您需要为游戏的每个单元格添加第三个布尔值……您可以扩展的对象不是可以节省大量时间而不是硬编码的数组索引吗? (由于这个原因,结构比基元数组好得多......) 我当然在需要时使用了更密集的数据表示,但程序员时间的开销必须是值得的。只是我的 $.02...

【讨论】:

  • 很好的一点是,即使在移动设备上,单人游戏内存也没什么大不了的。
【解决方案2】:

如果您要为每个单元格存储 2 个 BOOL 值,那么您可以只使用一个整数数组来完成这项工作。例如:

让我们假设两个 bool 值是 boolX 和 boolY,我们可以将它们组合成一个 int 为:

int combinedBool = boolY + (10*boolX);

因此您可以检索两个布尔值,例如:

BOOL boolX, boolY;
boolX = combinedBool/10;
boolY = combinedBool%10;

然后您可以将整个棋盘以一维整数数组的形式存储,每个单元格的索引由((yIndex*width)+xIndex) 表示,其中width 是棋盘上从左到右的单元格数,并且, xIndexyIndex 代表你板上单元格的 X 和 Y 坐标。

希望这对您的记忆管理和细胞组织有所帮助。

【讨论】:

  • 感谢您深思熟虑的回复以及将布尔值存储在一个整数中的巧妙方法。
  • 但如果你真的想失去表示能力并获得一个小的占用空间,你为什么要浪费每对 bool 多达 62 位?为什么不在 64 位 uint 中打包 32 对?
【解决方案3】:

您可以构建一个并使用malloc_size(myObject) 测试它的大小。数以千计的布尔值将足够小。事实上,您将能够使对象变大并享受 OO 设计的好处。例如,如果单元格还保留指向其相邻单元格的指针会怎样。细胞可以通过缓存访问其邻居来计算自己的 t+1 状态。

【讨论】:

  • 感谢您的回复。另外,malloc_size()sizeof() 是一样的吗?
  • sizeof 更像是理论大小,在编译时计算出来。 malloc size 会让你知道实际分配了什么。
猜你喜欢
  • 1970-01-01
  • 2017-10-25
  • 1970-01-01
  • 2013-11-17
  • 2016-02-23
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
相关资源
最近更新 更多