C中的动态2D阵列分配

时间:2010-08-19 21:14:38

标签: c++ c multidimensional-array

我应该如何在C中分配动态数组?目前我有一个名为malloc2D的函数,它看起来像这样:

void* malloc2D(size_t unitSize, uint firstCount, uint secondCount)
{
    void** pointer = malloc(sizeof(id) * firstCount);
    for (int i =0; i < firstCount; i ++){
        pointer[i] = malloc(unitSize * secondCount);
    }
    return pointer;
}

它工作正常然而我被告知它会对内存分配造成很大压力。最好或最常规的方法是什么?

3 个答案:

答案 0 :(得分:5)

您可以一次分配整个块:

int ** foo;

foo = malloc(sizeof(int*) * firstCount);
foo[0] = malloc(sizeof(int) * firstCount * secondCount);
for (int i=1; i<firstCount; i++)
{
    foo[i] = foo[0] + i * secondCount;
}

答案 1 :(得分:3)

我的建议是保留你拥有的东西。

  1. 它已经开发完毕。
  2. 经过测试。
  3. 不使用宏,直观/可读。
  4. 它是可扩展的。
  5. 没有定量识别瓶颈。
  6. 有时在没有问题时尝试优化可能会影响性能。你有没有对你的朋友理论做过任何基准测试?

    malloc大块需要定位连续的地址空间,甚至可能导致malloc在当前方法成功(address space fragmentation等)时失败。

    当我说你当前的实现是可扩展的时,我的意思是调整大小是微不足道的。你应该分配一个[100] [3]然后意识到你需要一个[100] [4]那么你需要做的就是100个非常小的reallocs,可能不会改变地址。但是,如果宏方法需要调整大小,则需要realloc可能不连续存在的整个块。更糟糕的是,数据不再适合宏访问,因为数学已经改变,因此您需要一系列昂贵的memmove

    总而言之,我认为始终以可读性,可维护性和易用性为代码进行编码非常重要 - 并且只有在建立瓶颈后才能进行优化。

答案 2 :(得分:0)

您可以将数组分配为这样的连续bloc。假设你想要整理:

int (*arr)[secondCount] = malloc( sizeof(int[firstCount][secondCount]) );

你可以隐藏一个宏,它将typename作为一个宏参数,虽然代码很简单,但实际上并不是必需的。