Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 显示在C+中创建临时表的位置+;_C++_Copy Elision_Temporaries - Fatal编程技术网

C++ 显示在C+中创建临时表的位置+;

C++ 显示在C+中创建临时表的位置+;,c++,copy-elision,temporaries,C++,Copy Elision,Temporaries,答案并不总是很容易从标准中推断出来,编译器优化可以进一步消除临时性 我已经在godbolt.org上做了实验,它非常棒。不幸的是,当谈到临时工时,它常常把树藏在装配工的木头后面。此外,激进的编译器优化选项使汇编程序完全不可读 要实现这一点,还有其他方法吗?“编译器优化可以进一步消除临时性。” 看来你对C++语义学有点误解。C++标准讨论临时定义程序的形式语义。这是一种描述大量可能执行的简洁方法 实际的编译器根本不需要这样做。通常情况下,他们不会。真正的编译器知道寄存器,真正的编译器不会假装POD

答案并不总是很容易从标准中推断出来,编译器优化可以进一步消除临时性

我已经在godbolt.org上做了实验,它非常棒。不幸的是,当谈到临时工时,它常常把树藏在装配工的木头后面。此外,激进的编译器优化选项使汇编程序完全不可读

要实现这一点,还有其他方法吗?

“编译器优化可以进一步消除临时性。”

看来你对C++语义学有点误解。C++标准讨论临时定义程序的形式语义。这是一种描述大量可能执行的简洁方法

实际的编译器根本不需要这样做。通常情况下,他们不会。真正的编译器知道寄存器,真正的编译器不会假装POD有(琐碎的)构造函数和析构函数。这在优化之前就已经发生了。我不知道有哪种编译器会在调试模式下生成平凡的编译器

现在,标准描述的一些语义只能通过相当接近的近似实现。当析构函数有明显的副作用时(想想
std::cout
),这些类型的临时变量就不能完全消除。但真正的编译器可能会在不分配任何存储的情况下实现可见的副作用。临时存在或不存在的概念是二元视图,实际上存在中间形式。

由于“似乎”规则,试图查看编译过程以查看临时对象的创建位置可能是不可靠的

但是,阅读代码(和编码),同时牢记本标准的以下段落,可能有助于找到创建或不创建临时表的位置

为了避免创建不必要的临时对象,临时对象的物化通常会尽可能地延迟。[ 注意:临时对象是物化的:

  • 将引用绑定到prvalue([dcl.init.ref]、[expr.type.conv]、[expr.dynamic.cast]、[expr.static.cast]、[expr.const.cast]、[expr.cast])时

  • 对类prvalue([expr.ref]、[expr.mptr.oper])执行成员访问时

  • 在对数组值执行数组到指针的转换或订阅时

  • 初始化std类型的对象时​::​带括号的初始列表([dcl.init.list])中的初始值设定项列表

  • 对于某些未计算的操作数([expr.typeid]、[expr.sizeof]),以及

  • 当prvalue显示为丢弃的值表达式时

在C++17标准的本段中,术语prvalue有一个新的定义:

prvalue是一个表达式,其计算初始化对象或位字段,或计算运算符的操作数的值,具体由其出现的上下文指定


在上一个标准(C++20之前)中,段落[basic.lval]被移动到表达式[expr]因此,我们所知道的值类别正在演变为表达式类别。

静态分析,例如,检查
性能不必要的复制初始化
杂项未使用的raii
听起来像是您正在寻找的。GCC的
--保存临时文件
是否有帮助?启用编译器选项以生成程序集并检查它是。@KerrekSB,用于
.i
.s
等文件。您试图解决的实际问题是什么?