声明var外部循环不好?

mar*_*zzz 1 c++ memory performance loops declaration

我为我正在制作的DSP /音频应用编写了这个基本代码:

double input = 0.0;
for (int i = 0; i < nChannels; i++) {
      input = inputs[i];
Run Code Online (Sandbox Code Playgroud)

一些DSP工程专家告诉我:"你不应该在循环之外声明它,否则它会创建一个依赖项,编译器无法尽可能高效地处理它."

input我在想他正在谈论var .为什么这个?是不是更好地去掉一次并覆盖它?

也许有些事情与不同的内存位置有关?即注册而不是堆栈?

Ser*_*sta 6

八十年代早期的老式K&R C编译器曾经尽可能地编写程序员编写的代码,程序员过去常常尽力生成优化的源代码.现代优化编译器可以返工,只要生成的代码具有原始代码相同的可观察效果.所以在这里,假设input变量不在循环外使用,优化编译器可以优化该行,double input = 0.0;因为在下一次赋值之前没有可观察到的影响:input = inputs[i];.由于同样的原因,它可能与循环外的变量赋值(无论是在源C++文件中是否在内部)相同.

简短的故事,除非你想为一个具有一个特定参数集的特定编译器生成代码,并且在这种情况下你应该彻底检查生成的汇编代码,你永远不应该担心那些低级优化.有人说编译器比你聪明,其他人说编译器会以我写的方式生成自己的代码.

重要的是可读性和可变范围.这input是循环的本地函数,因此它应该在循环内声明.完全停止.除非您对低级优化有特殊要求(分析显示这些行需要特殊处理),否则任何其他优化考虑都是无用的.