2010-10-17 78 views
1

我正在阅读关于优化teckniks的书。例子中没有太多的描述或建议。这里的东西:C“静态”优化

int agag(int a) 
{ 
    static int dfdfdf = 0; 
    static int prev_resilt = 0; 
    if (dfdfdf == a) 
    return prev_result; 
    dfdfdf = a; 
    a = SomeCalcs(); 
    prev_result = a; 
    return a; 
} 

关键是:如果参数是与以前的计算相同,它会立即返回以前的结果,避免了硬计算。 现在的问题是:这两个静态变量是否会一直存在,直到程序结束?据我了解,有很多这些是不好的事情?

我知道这并没有太多的优化。但我只关心静态变量的影响..

非常感谢您的答案!

+3

这种类型的优化只有在以下情况下才适用:(1)计算费用昂贵;(2)机会很高,可能会用相同的参数再次调用该函数。 – 2010-10-17 19:06:40

+0

请张贴本书的名称/作者。 – 2010-10-17 19:49:24

+0

Harriet Gecks。优化C++ – Kane 2010-10-17 20:12:50

回答

8

静态变量使用的内存将分配到数据段中而不是堆或堆栈中。当你有大量的静态变量时,这只会成为一个问题,因为这意味着可执行文件将不得不从磁盘加载更大的数据段。

但这种方法最大的问题是它只存储一个值。如果您希望使用相同的输入进行多次重复,则只需实施适当的memoization即可。

+0

太多本地变量会增加堆栈,本地全局变量(静态)位于数据段中,因此更具可控性和可预测性。对于任何一种类型都必须同样小心。 – 2010-10-17 19:38:51

0

是的,它们存在,直到你的程序结束。只要您确定输入0a结果为0,您就可以。

8

是的,static变量的生命周期是一直到程序结束。

但是,这样做会将状态添加到您的函数中。这使得它非线程安全,更难调试,并且更难以测试。这些通常被认为是不好的事情。

0

你忘了指定dfdfdfa,以及其他小错误。

是的,这两个变量会在程序的整个生命周期中占用内存,就像它们是全局变量一样。他们可能会使用8个字节。功能agag的代码占用了更多的空间,并且直到程序结束时才会被回收。你为什么不担心呢?

+0

该代码不占用运行时存储空间,因为内存中的副本与文件系统缓存中的副本一致,并且可以随时丢弃和重新加载......更不用说它在进程间共享。这与数据非常不同。 – 2010-10-17 19:04:27

+0

是的,对不起。原始代码有点不同。我只专注于“新”结果部分,完全忘记恢复dfdfdf = a; – Kane 2010-10-17 19:09:37