0

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

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

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

4

3 回答 3

3

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

    int aReallyLargeVariable[10000];

不会花很多时间

    int aReallyLargeVariable[10000] = {0};

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

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

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

于 2016-05-06T09:49:11.727 回答
1

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

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

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

于 2016-05-06T10:00:28.367 回答
0

我建议将它们分配为静态的,这样 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中时才有效,反之亦然

于 2018-05-26T18:44:36.897 回答