c - C语言循环中的内存分配成本

标签 c allocation

在时间成本方面,在循环内部或外部分配数组是否有显着差异?

我在程序的循环内的函数中使用了很多数组,我是否应该将所有数组作为函数参数传递以提高性能,尽管它会降低可读性?例如:

#include <stdlib.h>
#define N 1000000
void foo()
{
    int* array = (int*)malloc(N*sizeof(int));
    /*
    Do something with the array
    */
    free(array);
}
int main()
{
    int i;
    for(i=0; i<1000000; i++)
        foo();
    return 0;
}

#include <stdlib.h>
#define N 1000000
void foo(int* array)
{
    /*
    Do something with the array
    */
}
int main()
{
    int i;
    int* array = (int*)malloc(N*sizeof(int));
    for(i=0; i<1000000; i++)
        foo(array);
    free(array);
    return 0;
}

最佳答案

内存分配的成本不是很依赖于分配的大小。粗略地说,任何大小的内存分配都是 O(1),显然标准库已优化以尽可能快地进行分配。

所以如果你需要一个非常大的分配,就像在示例程序中那样,与初始化分配内存的成本相比,分配的成本将是微不足道的(更不用说实际进行所需计算的成本了) .

对于非常紧凑的循环中的小分配,分配开销可能很明显,替代机制可能会有用;其中之一是问题中建议的,将预分配的数组作为附加参数传递给函数。 (其他可能性包括使用 C 的可变长度数组 (VLA),如果它们在所有目标平台上可用,或 alloca/_alloca/_malloca。 )

但我建议在有确凿证据证明节省时间是合理的之前不要实现这种形式的微优化;否则,可维护性和可读性方面的成本将超过您可能节省的任何时间。

关于c - C语言循环中的内存分配成本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28919465/

相关文章:

memory - 如何在运行时在 Rust 中分配数组?

C++ delete [] - 如何检查是否为 "all is deleted"?

c++ - 如何将 C++ 或 C 中的字符串转换为整数数组?

c中main之外的命令行处理

使用结构的 C 函数,为什么它不起作用?

python - 在 python 中跟踪对象分配

c++ - 动态创建的字符串分配在堆或堆栈上 - C

c - Pthread 属性使用

c - 使用 libpulse 播放多个流

c - 在 C 中多次正确返回一个字符串