问题标签 [temporaries]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
208 浏览

c++ - 显示在 C++ 中创建临时对象的位置

找出在我的 C++ 代码中创建临时对象的位置的最快方法是什么?

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

我已经尝试过godbolt.org和它太棒了。不幸的是,当涉及到临时工时,它经常将树木隐藏在装配工的木头后面。此外,激进的编译器优化选项使汇编器完全不可读。

还有其他方法可以做到这一点吗?

0 投票
1 回答
109 浏览

c++ - 保存 C++ 表达式中的临时对象生命的最佳方法

考虑一个X带有重载右关联 C++ 运算符的二元运算: a+=b+=c-->Y{a, X{b,c}}

可以从某种语法树(X 和 Y 对象的组合)中的表达式“冻结”有关操作数的所有信息,并在以后访问它。(这不是问题

如果我存储Y::r为值(如上),则将涉及复制或至少移动。如果我存储Y::r为右值引用(例如X&& r;),那么它将引用一个临时的,当表达式结束时将被销毁,给我留下一个悬空的引用。

为了在多个地方多次使用已经构建的表达式,捕获它或防止这种自动破坏的最佳方法是什么?

  • 通过捕捉我的意思是以某种方式延长它的寿命,而不是手动将它分配给局部变量(有效但不能很好地扩展!想想这个案例a+=b+=…+=z:)
  • 我知道移动比复制便宜......但什么都不做更好(对象在那里,已经构建)
  • 您可以将表达式作为右值引用参数传递给函数或 lambda,并在该函数/lambda 内部访问其成员......但您不能重用它(外部)!您必须每次都重新创建它(有人称这种方法为“厄运 Lambda”,也许还有其他缺点)

这是一个测试程序(位于https://godbolt.org/z/7f78T4zn9):

这是一个输出示例,您可以在其中看到 X 临时对象的地址进入 Y::r ... 并在有机会捕获它之前立即销毁:

0 投票
3 回答
115 浏览

c++ - C++ 中的临时变量到底是什么,在哪些特定情况下编译器会创建它们?

我是 C++ 新手,我在临时主题上苦苦挣扎。我在任何地方都找不到编译器将创建临时文件的所有情况的明确列表。实际上,几天前我想到,当我们将右值作为const 引用参数传递时,编译器将创建一个临时值并将右值放入该临时值以保存它,并将临时值作为参数传递。把这个例子给我的老师,

他说在这种情况下编译器不会创建一个临时的,而是会直接优化代码,替换函数体内所有出现的 10,所以在那之后,我比以往任何时候都更加困惑。