可以更改自动分配内存的范围会影响性能吗?

时间:2015-04-18 07:03:27

标签: c++ c performance memory-management

我有一个程序涉及对少数函数的大量调用,每个函数在本地分配固定大小的数组(总共大约几百个字节)。假设将所有分配移动到main然后传递指针会获得更好的速度是否正确?换句话说,从堆栈指针中减去线性或恒定时间,并且,如果需要恒定时间,那么与将指针传递给函数相比,成本是多少?

我做了一个小速度测试。示例#1运行得快一点。

示例#1

using namespace std;
#include <iostream>
int f(int* a){

    // do stuff

    return 0;
}

int main(){

    int a[1000];

    int x;
    for (int i = 0; i < 50000; ++i){
        x=f(a);
    }
    return 0;
}

示例#2

using namespace std;
#include <iostream>

int f(){

    int a[1000];

    // do stuff...

   return 0;
}

int main(){

    for (int i = 0; i < 50000; ++i){
        x=f();
    }
    return 0;
}

2 个答案:

答案 0 :(得分:5)

你似乎理解本地空间的分配是昂贵的,而事实上它并不是(它只是来自堆栈指针的减法)。

考虑到你可能用指针反向引用&#34;半全局&#34; main()中的局部变量,我看不出你提出的任何实际价值,尽管我们当然有可能提出一个证明我错误的特殊例子。

一般来说,尝试在编码的早期阶段进行优化是一个坏主意。特别是如果你交易简单,易于阅读/理解(可疑)效率。

尝试编写尽可能简单明了的代码。如果有必要,可以在以后阶段进行优化,而不是在您明确发现瓶颈之前进行优化(这并不容易)。

答案 1 :(得分:0)

两者的编写方式没有区别。

在某些系统上,堆栈上的大量分配可能会导致问题,但[1000]是一个相对较小的数组,您永远不会分配多个。

考虑f()是递归函数的情况。然后就可以进行大量的重复分配。