1

换句话说:就通过内存和/或速度(理解和可读性是给定的)的运行时性能而言,这两个代码块是等效的还是不同的?

A、声明接近首次使用:

double A = /*...*/
double B = /*...*/

if(A > B) return false;

double C = /*...*/
double D = /*...*/

if(C < D) return false;

double E = /*...*/
double F = /*...*/

if(E > F) return false;

double G = /*...*/
double H = /*...*/

if(G < H) return false;

return true;

B、先声明所有变量:

double A = /*...*/
double B = /*...*/
double C = /*...*/
double D = /*...*/
double E = /*...*/
double F = /*...*/
double G = /*...*/
double H = /*...*/

if(A > B) return false;
if(C < D) return false;
if(E > F) return false;
if(G < H) return false;
return true;
4

3 回答 3

3

对于现代编译器,这两个代码都应该产生相同的目标代码。基于基本的静态分析,特别是use-def 分析liveness 分析,这些案例很容易识别和优化。

假设没有任何赋值涉及较早的变量,堆栈帧将仅包含 2 个双精度值,因为在任何时候只有 2 个双精度值存在。

当指针起作用时,由于潜在的混叠,事情可能会发生巨大变化。volatile如果使用不当,s 也会破坏优化。

于 2013-09-10T04:48:14.143 回答
2

不——至少对于我所知道的任何编译器,它们都会产生等效(通常相同)的目标代码,而且我很难想象一个编译器会为一个与另一个产生显着不同的目标代码。

于 2013-09-10T04:38:35.447 回答
0

不过没关系,我总是先声明我的变量,因为这样更易读。

一旦你开始在整个地方混合声明并将它们缩进,那么它们可以被隐藏,或者如果在以后你想更改你的代码并且需要在范围之外访问它,你无论如何都必须移动它(可能麻烦也可能不麻烦)

于 2013-09-10T04:55:53.940 回答