我目前正在为iPhone制作Conway的生命游戏模拟器,我对内存管理有一些疑问。请注意,我正在使用ARC。
对于我的应用程序,我将需要大量的C样式structs
或Objective-C对象来表示单元格。可能有几千个,很明显,记忆管理浮现在脑海中。
Structs
我对结构的论证是单元格不需要典型的OO属性。他们将持有的唯一值是两个BOOL
值,因此这些单元格不会占用大量内存。另外,我需要使用二维数组。使用结构,我可以使用C风格的2d数组。据我所知,Objective-C中没有替代品。我觉得为两个布尔值创建一个对象是过度的。
Objective-C对象我的论点(以及大多数其他人)是围绕Objective-C对象的内存管理非常容易和有效的ARC。此外,我已经看到struct
对于一个对象来说并不是一个很大的内存减少的论点。
所以,我的问题。我应该选择老式,精益,兼容二维数组structs
吗?或者我应该坚持使用典型的Objective-C对象并冒使用的额外内存。
后续:如果您推荐Objective-C对象,请提供表示二维数组的备用存储方法。这很关键,也是使用Objective-C对象的最大缺点之一 三江源。
答案 0 :(得分:4)
"过早优化是所有邪恶的根源" ...如果您正在尝试构建具有100,000个用户并发播放的Game of Life服务器,则内存占用可能很重要。对于任何现代设备上的单人实现,即使是移动设备,内存大小也非常具有学术性。 因此,无论是游戏运行还是运行最快,或者(更好)使代码最具可读性和可维护性。人类周期比计算机周期花费更多。假设你需要为游戏的每个单元格提供第三个布尔值...不会是一个可以延伸的对象,而不是硬编码的数组索引? (由于这个原因,结构比基元数组好很多......) 当我需要时,我当然会使用更密集的数据表示,但程序员时间的开销必须值得。只是我的$ .02 ......
答案 1 :(得分:2)
如果您要为每个单元格存储2个BOOL值,那么您可以使用整数数组来完成这项工作。例如:
让我们假设两个bool值是boolX和boolY,我们可以将它们组合成一个int:
int combinedBool = boolY + (10*boolX);
所以你可以检索两个bool值,如:
BOOL boolX, boolY;
boolX = combinedBool/10;
boolY = combinedBool%10;
然后你可以将整个电路板存储为单个维整数数组,其中每个单元格的索引由((yIndex*width)+xIndex)
表示,其中width
是从左到右的单元格数您的电路板,xIndex
和yIndex
代表电路板上单元格的X和Y坐标。
希望这有助于您的记忆管理和细胞组织。
答案 2 :(得分:0)
您可以使用malloc_size(myObject)
构建一个并测试其大小。成千上万的bools足够小。事实上,您将能够使对象更大,并享受OO设计的好处。例如,如果单元格还保持指向其相邻单元格的指针,该怎么办?单元格可以通过缓存访问邻居来计算自己的t + 1状态。