使用大型局部变量优化频繁调用的函数(C ++)

时间:2016-05-06 09:42:34

标签: c++ optimization stack-memory static-memory-allocation

让我们说有一个功能我需要拨打数百万次。由此函数执行的算术运算不是很重,因此唯一重要的是所有变量的分配速度。我们还假设变量总是在堆栈上分配。 最简单的案例:

void doSomething(){
    int aReallyLargeVariable[10000];
    ...performing a few light operations on that variable and returning nothing...
}

我知道当函数返回时,它的所有变量都被销毁,所以
通过使其变为静态或全局来缓存此变量会不会更好?什么是优化它的最佳方法?

3 个答案:

答案 0 :(得分:3)

不会导致性能问题的分配。问题是在

时初始化它
    int aReallyLargeVariable[10000];

不会花很多时间

    int aReallyLargeVariable[10000] = {0};

会做的。动态创建大型对象也会导致问题。

如果你有一个逻辑不是很重的函数并且只使用原始类型,那么只需将其定义为inline并且不要担心性能。

如果您需要定义大量对象,请考虑另一个不需要拥有1000个或更多元素的stackvector数据结构

答案 1 :(得分:1)

要优化此功能,考虑到多次调用,第一步必须是do not declare the large variable locally。当你这样做时,会发生一些事情:

  • 浪费了大量的堆栈空间,因为您在本地声明了数组,并且可能只使用了一些值。
  • 由此声明引起的堆栈操作(push / pop)可能超过该函数必须执行的实际工作。

最好在其他地方声明这个数组(如果必须的话,全局声明它)并传入一个指向数组的指针。这样你也可以重用内存而不是浪费时间重新分配。

答案 2 :(得分:0)

我建议将它们分配为静态,以便整个int aReallyLargeVariable[10000];不会在每次调用函数时分配和释放这么大量的内存来打扰堆栈。但是,您也可以声明int aReallyLargeVariable[10000]; 作为全球性的,但许多开发人员在他们的代码中讨厌很多全局变量。如果你不喜欢函数中的静态变量(由于并发执行等)并且不喜欢全局变量,那么你可以在全局范围内将变量声明为static,这样变量名只能是在其声明的上下文中有效,可以防止链接器错误。

<强> Source.cpp

static int aReallyLargeVariable[10000];
void myFunction()
{
    aReallyLargeVariable[1] = 10;
}

<强> Object.cpp

int aReallyLargeVariable[10000];  /* No name collisions during linking */

注意:只有在您决定不在 Object.cpp 中包含 Source.cpp 或反之亦然

时,它才有效