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

Optimizing frequently called function with large local variables (C++)

本文关键字:调用 函数 优化 大型 局部变量 C++      更新时间:2023-10-16

假设有一个函数需要调用数百万次。这个函数执行的算术运算并不那么繁重,所以唯一重要的是所有变量的分配速度。我们还假设变量总是在堆栈上分配的。最简单的例子:

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

我知道当函数返回时,它的所有变量都会被破坏,所以
通过将这个变量设置为静态或全局来缓存它不是更好吗?优化它的最佳方法是什么?

不是分配会导致性能问题。问题是初始化它,所以当

    int aReallyLargeVariable[10000];

不会花很多时间

    int aReallyLargeVariable[10000] = {0};

也可以。动态创建巨大的对象可能会造成问题。

如果您有一个没有很重逻辑并且只使用基元类型的函数,只需将其定义为inline,并且不必担心性能问题。

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

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

  • 大量的堆栈空间被浪费了,因为您在本地声明了数组,并且可能只使用了几个值
  • 此声明引起的堆栈操作(push/pop)可能会超过函数必须完成的实际工作

最好在其他地方声明这个数组(如果必须的话,全局声明它),并传递一个指向数组的指针。通过这种方式,您还可以重用内存,而不会浪费时间重新分配。

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

源.cpp

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

对象.cpp

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

注意:只有当您不决定将Source.cpp包含在Object.cpp时,它才有效,反之亦然