在连续的内存块中分配objective-c对象

时间:2011-03-06 15:35:18

标签: objective-c ios memory-management

我想从某个objective-c类中分配x个对象,使它们在内存中连续布局。该平台是iOS。

我想解决的实际问题是如何将这些x对象存储在内存中,这样我就可以尽可能少地缓存它们来迭代它们。我正在考虑创建一个简单的c样式的objective-c对象数组,但是当我用Obj *obj = [[object alloc] init];分配这样一个对象并将其分配给我的数组中的索引时,我只是存储指针,所以这显然不起作用。

我该如何做到这一点?

编辑:更多背景:我正在尝试将面向数据的设计应用到我的iOS游戏引擎中,我相信以这种方式在内存中布置对象会让我轻松获得性能(我错了吗?)作为我的当前的引擎需要进行最少的调整。

3 个答案:

答案 0 :(得分:5)

如果您真的想这样做(除非您确定自己面临瓶颈,否则不要优化),您必须覆盖您班级的+allocWithZone:方法。我建议你阅读Mike Ash最近的精彩文章Custom Object Allocators in Objective-C。引用它:

  

Objective-C对象只是一块具有正确大小的内存块,并且第一个指针大小的块设置为指向对象的类。因此,自定义分配器需要返回一个指向正确大小的内存块的指针,并且该类已正确填写。

所以你可以先分配大量的内存(calloc())然后你的allocWithZone:方法可以在这个大块的内存中保留一个空间,位于正确的位置。

答案 1 :(得分:1)

如果您担心性能达到分析缓存未命中的程度,那么您可能更好地在C中编写代码而只使用最小的Objective C层。但这有必要吗?您是否已分析过代码并确定缓存未命中会降低代码速度?

如果您认真考虑必须手动分配内存,则需要查看Memory Allocation Techniques

答案 2 :(得分:1)

这听起来更像是你应该使用C / C ++作为游戏引擎,在顶部使用Objective-C的贴面使其易于使用。

也就是说,假设您已经测量了性能问题,这些问题实际上只能通过内存中对象的连续布局来解决。