c++ - 是否有常量的 C++ 临时右值

标签 c++ c++11

当将文字常量/基本类型分配给变量时,是否会在 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+21 的存在。因此,在标准下,编译器可以自由编译 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;

然后简单打印 1030 的明显优化就落空了。

当以这种方式对 C++ 进行推理时,您必须注意可观察到的行为是什么,并且知道编译器可以随意丢弃其余部分。稍加小心,您就可以在中间结果在运行时实际不存在的情况下进行零成本抽象。

关于c++ - 是否有常量的 C++ 临时右值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37766838/

相关文章:

C#:非法 Switch 语句的解决方法?

c++11 - 这个简单的结构应该有一个隐式的移动构造函数吗?

c++ - 将 std::list<std::unique_ptr> 移动到 vector 中尝试引用已删除的函数

c++ - 在 C++ 中初始化一个 std::bitset 数组

c# - 从 C++ 包装代码以在 C# 中使用

c++ - 如何在mac上使用c++17并行标准库算法?

c++ - 仅存在声明时不包含类头

c++ - 取消引用运算符不起作用(语法问题?)

c++ - 使用 XGrabKey 或 XGrabKeyboard 重定向键盘输入

c++ - 为什么 move 指针变量不会将其设置为空?