当将文字常量/基本类型分配给变量时,是否会在 C++ 中生成临时变量? C++ 规范(c++98、c++11、c++14、c++17 等)之间是否存在差异?
int a = 1; // 1 here is likely loaded in microcode level, right? But not guaranteed not to generate a temp value
int b = 1+2; // evaluated to 3 at compile time as const, also 3 might not exist in microcode. Likely temp value
auto c = 3; // creates an int based on 3. No temp value
int a{1}; //no temp value?
我正在阅读 https://herbsutter.com/2013/05/13/gotw-2-solution-temporary-objects/ .
此外,我认为我在这一切上完全错了
最佳答案
C++ 语言是由标准定义的。在标准中,它描述了抽象机器在格式良好的程序上运行的行为,该程序执行标准定义的行为。
C++ 的核心规则是as-if 规则。在 as-if 规则下,编译器生成的代码可以随心所欲地表现,只要其在标准下可观察到的行为与标准规定的相匹配。 p>
在标准下,无法观察到 1+2
中 1
的存在。因此,在标准下,编译器可以自由编译 1
从未存在过的代码,并简单地生成数字 3
。
此外,如果您从不使用变量 x
,则语句
int x = 1+2+3+4;
没有效果。所以编译器可以自由地永远不使用它。事实上,您永远不会引用值x
或更改它的值,那么变量x
就可以从程序中完全消除。无论何时使用,值 10
都可以替换它。
通常,优化编译器会做一些称为“静态简单赋值”的事情,即使您多次赋值给 x
,它实际上也将其视为对不同变量。只有当您引用或指向 x
时,它才会崩溃。
所以
int x = 1+2+3+4;
std::cout << x;
x += 20;
std::cout << x;
可以当作
const int x_0 = 10;
std::cout << x_0;
const int x_1 = x_0 + 20;
std::cout << x_1;
然后简单打印 10
和 30
的明显优化就落空了。
当以这种方式对 C++ 进行推理时,您必须注意可观察到的行为是什么,并且知道编译器可以随意丢弃其余部分。稍加小心,您就可以在中间结果在运行时实际不存在的情况下进行零成本抽象。
关于c++ - 是否有常量的 C++ 临时右值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37766838/