c++ - 当将变量声明移动到接近首次使用时,它们是否在 return 语句之后有关系吗?

标签 c++

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

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;

最佳答案

对于现代编译器来说,这两种代码应该产生相同的目标代码。这些情况很容易根据基本的静态分析进行识别和优化,特别是 use-def analysisliveness analysis .

假设没有任何赋值涉及较早的变量,堆栈帧将只包含 2 个 double ,因为在任何时候只有 2 个 double 是活的。

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

关于c++ - 当将变量声明移动到接近首次使用时,它们是否在 return 语句之后有关系吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18710789/

相关文章:

c++ - 错误 C2440 : '=' : cannot convert from 'ListNode<T> *' to 'ListNode<T> *'

C++11 在运行时索引模板参数包以访问第 N 类型

c++ - fstream 写入文件

c++ - vector 和抽象类

c++ - 创建具有可变维数的 C++ vector

c++ - 如果我们对所有 C/C++ 文件使用统一的扩展名 (.c/.cpp),会有什么不同?

c++ - 为什么这个虚拟调用模棱两可?

c++ - 发布几个回调作为函数参数

java - JNI : can't convert jstring to LPCTSTR?

C++隐式内联函数