是否有一个c++;常量的临时右值 当一个常数/基本类型被赋值给变量时,C++中是否生成了临时变量?C++规范(C++ 98、C++ 11、C++ 14、C++ 17等)是否存在差异?< /P>

是否有一个c++;常量的临时右值 当一个常数/基本类型被赋值给变量时,C++中是否生成了临时变量?C++规范(C++ 98、C++ 11、C++ 14、C++ 17等)是否存在差异?< /P>,c++,c++11,C++,C++11,我正在读书 另外,我假设我在所有这些方面都是完全错误的。如果我们要具体一点,就必须区分临时对象和临时值。属于类类型的临时对象。这是C++标准讨论的,人们谈论“临时”时通常指的是什么。当人们谈论临时值时,他们真正的意思是中间结果。i、 e,从寄存器中交换值 你所有的例子: int a = 1; int b = 1+2; auto c = 3; int d{1}; 不要创建任何“临时文件”,因为不需要创建任何“临时文件”。“1+2”很可能被折成一个常数。甚至不需要生成操作码。此程序的最小程序集为:

我正在读书


另外,我假设我在所有这些方面都是完全错误的。如果我们要具体一点,就必须区分临时对象和临时值。属于类类型的临时对象。这是C++标准讨论的,人们谈论“临时”时通常指的是什么。当人们谈论临时值时,他们真正的意思是中间结果。i、 e,从寄存器中交换值

你所有的例子:

int a = 1;
int b = 1+2;
auto c = 3;
int d{1};
不要创建任何“临时文件”,因为不需要创建任何“临时文件”。“1+2”很可能被折成一个常数。甚至不需要生成操作码。此程序的最小程序集为:

a:
        .long   1
b:
        .long   3
c:
        .long   3
d:
        .long   1

您链接的GOTW更关注关于“按值传递”和最小化类临时对象的不必要副本的总体争论。除非过早地进行优化,否则几乎没有理由关心文字类型,无论是否创建临时类型。

C++语言是由标准定义的。在标准中,它描述了在格式良好的程序上运行的抽象机器的行为,执行标准定义的行为

< > C++的核心规则是AIFF规则。在“仿佛”规则下,编译器生成的代码可以自由地按照它想要的方式进行操作,只要它在标准下可观察到的行为与标准状态相匹配

根据标准,无法观察
1+2
中是否存在
1
。因此,在该标准下,编译器可以在
1
不存在的地方自由编译代码,只需生成编号
3

此外,如果从不使用变量
x
,则语句

int x = 1+2+3+4;
没有效果。因此,编译器可以自由地从不使用它。事实上,您从不引用值
x
或更改其值,那么变量
x
就可以从程序中完全消除。无论何时使用,值
10
都可以替换它

通常,优化编译器会执行一种称为“静态简单赋值”的操作,在这种情况下,即使多次赋值给
x
,它实际上也会将其视为对不同变量的赋值序列。只有在引用或指针指向
x
时,才会出现故障

所以

intx=1+2+3+4;

你能问一下语言标准描述的抽象,或者编译器实际发出的机器代码吗?谁说这个变量甚至存在于最终的代码中?您询问的细节只有您的反汇编程序知道。另外,C++允许编译器根据他们机器心的需要来制造尽可能多的时间。第一行可以是
inta=int(int(int(int(1)))
。@OliverCharlesworth我想这是both@GManNickG这是一个有趣的观点。也许不是那个具体的例子,但有什么理由这样抽象吗?你能引用标准中的临时值术语吗?如果不是,你能清楚地说你是在谈论一个典型的C++实现,而不是C++ +?@ yakk我试图区分“临时对象”(标准中的)和“临时值”(不是在标准中,而是在语音中使用)。“临时值”是OP在他的问题中使用的。为了澄清,“IIF”适用于标准(一个编译器对C++定义的解释),以及用户期望的(在执行过程中产生的程序)。在后者中,如果操作系统希望某个值位于该地址,但编译器确定程序本身从未使用过某个常量,那么这难道不能破坏内容吗?@MathFromScratch“as-if”规则只是标准规则。用户期望不是标准的(直接)问题。如果OS在地址上期望值,则C++编译器需要添加额外的保证,或者它需要有一个API,地址在这里传递给操作系统。
int x = 1+2+3+4;
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;