我应该如何在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;
}
它工作正常然而我被告知它会对内存分配造成很大压力。最好或最常规的方法是什么?
答案 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)
我的建议是保留你拥有的东西。
有时在没有问题时尝试优化可能会影响性能。你有没有对你的朋友理论做过任何基准测试?
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作为一个宏参数,虽然代码很简单,但实际上并不是必需的。