让我们说有一个功能我需要拨打数百万次。由此函数执行的算术运算不是很重,因此唯一重要的是所有变量的分配速度。我们还假设变量总是在堆栈上分配。 最简单的案例:
void doSomething(){
int aReallyLargeVariable[10000];
...performing a few light operations on that variable and returning nothing...
}
我知道当函数返回时,它的所有变量都被销毁,所以
通过使其变为静态或全局来缓存此变量会不会更好?什么是优化它的最佳方法?
答案 0 :(得分:3)
不会导致性能问题的分配。问题是在
时初始化它 int aReallyLargeVariable[10000];
不会花很多时间
int aReallyLargeVariable[10000] = {0};
会做的。动态创建大型对象也会导致问题。
如果你有一个逻辑不是很重的函数并且只使用原始类型,那么只需将其定义为inline
并且不要担心性能。
如果您需要定义大量对象,请考虑另一个不需要拥有1000个或更多元素的stack
或vector
数据结构
答案 1 :(得分:1)
要优化此功能,考虑到多次调用,第一步必须是do not declare the large variable locally
。当你这样做时,会发生一些事情:
最好在其他地方声明这个数组(如果必须的话,全局声明它)并传入一个指向数组的指针。这样你也可以重用内存而不是浪费时间重新分配。
答案 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 或反之亦然
时,它才有效