【问题标题】:ObjC 2D array: array of array vs linear array vs C array?ObjC 2D数组:数组数组vs线性数组vs C数组?
【发布时间】:2013-05-05 23:26:03
【问题描述】:

我在实现一个二维数组,关心实现细节的效率,二维数组接口应该提供两个必要的方法:

(假设数组是固定大小,创建时指定,所以没有动态大小变化)

  1. getObjectAtRow:Column:

  2. setObjectAtRow:Column:

  3. enumerateUsingBlock:^(id obj, NSUInteger 行, NSUInteger 列, BOOL *stop)

实施:

数组数组 (NSMutableArray)

拥有一个大小为rowCount 的NSMutableArray,其中的每个元素都是一个大小为columnCount 的NSMutableArray,然后getter 将获取行数组,然后从行数组中获取指定列的对象,setter 将使用相同的技术.枚举器使用两个枚举块,一个用于遍历行数组,每个行数组另一个枚举器用于所有对象。

线性数组(NSMutableArray)

只有一个 NSMutableArray 的实际对象,getter 和 setter 将使用以下方法计算索引:

索引 = 行 * 列数 + 列;

枚举器遍历线性数组,计算行列:

行 = 索引 / 列数 column = index % columnCount

C 数组(假设元素是结构而不是类对象并且大小是预定义的)

所以我有:

MyStruct elements[ROW_COUNT][COLUMN_COUNT]

然后用通常的 C 方式使用它,getter/setter 只是获取/设置:

elements[row][column]

而枚举只是使用了两个for循环

我的担忧:

  1. 哪一种效率更高?我觉得 C 数组听起来效率更高,但是内存管理是不是有点难,尤其是在使用 ARC 的时候?

  2. 哪个更好?线性阵列或阵列阵列?也就是说,在线性数组中进行生产/除法获取/设置对象是否更快,还是使用数组数组更快?

谢谢

【问题讨论】:

    标签: ios objective-c arrays


    【解决方案1】:

    最快的选择将是 C 数组,如果您真的关心性能,您不应该将它包装在 Objective C 类中,而是使用 C 结构或直接变量。

    但最简单、几乎高效的方法是使用一维 NSMutableArray 和一些内联包装函数:

    inline id getObjectAt( NSMutableArray *o, int row, int col ) {
        return [o objectAtIndex: row * MY_FIXED_WIDTH_HERE + col];
    }
    inline void setObjectAt( NSMutableArray *o, int row, int col, id value ) {
        return [o replaceObjectAtIndex: row * MY_FIXED_WIDTH_HERE + col withObject: value];
    }
    

    函数将被内联,但仍有一个 Objective-c 函数查找要执行 (objectAtIndex/replaceObjectAtIndex)。通常对性能的影响可以忽略不计;只有在基准测试表明它很重要时才担心它。

    对于实现一个 C 数组:内存管理很容易;只需在 dealloc 函数中为每个元素添加一个循环 release,并在 set 函数中小心(保留新对象然后释放前一个对象)。您还需要设置您可能需要的任何复制和序列化/反序列化功能,以及niliniting 时的项目。至于 ARC,您可以按文件配置它,因此只需为此对象的 .m 文件禁用它即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多