短路临时寿命
Short-circuited temporary lifetime
本文关键字:短路 更新时间:2023-10-16
>假设我们有一个短路的布尔表达式,例如,
f(g() && std::string().size() == 0);
我正在考虑std::string
暂时的生命周期。通常,编译器会在完整表达式结束时销毁临时表达式。但在这种情况下,这是不合适的,因为它不知道g()
是否返回了 true。所以我想知道编译器通常如何处理这种情况。它们是否存储一个变量,告诉它们是否发出析构函数调用?还是标准允许他们提前销毁临时?
&&
短路,因此只有在返回 true g()
的情况下,才会(根本不)评估std::string().size()
。IOW,如果g()
没有返回 true,则无需担心销毁临时字符串的时间 - 因为它永远不会首先创建。
例如,给定如下代码:
#include <iostream>
#include <stdlib.h>
bool g() { return rand() & 1 == 0; }
void f(bool val) {
std::cout << std::boolalpha << val;
}
int main(){
f(g() && std::string().size() == 0);
}
VC++ 生成的代码使用临时变量$T1
跟踪临时变量是否生成,并且仅在 $T1
为 true 时才销毁临时变量,因此序列如下所示:
int $T1 = 0
call g()
if (retval == 0)
goto $LN3
call std::string::string()
$T1 = true;
call temp_string.size();
if (retval != 0)
goto $LN3
$TV74 = 1
goto $LN4
$LN3 :
$TV74 = 0
$LN4 :
call f($TV74);
if ($T1 == 0)
goto $LN7
call std::string::~string();
$LN7:
return 0;
在从汇编语言翻译回此伪代码时,我省略了一些不相关的细节,但保留了原始流程和足够相似的名称,如果需要,可以很容易地将它们与原始名称进行比较。
相关文章:
- 为什么当你将函数的返回值乘以零时它不会短路?
- 短路运算符在enable_if
- C++概念精简版:概念体中的短路
- 折叠表达式会短路吗?
- C 中的短路评估和分配
- c++:用于短路的 if 块语法中的多重赋值
- 中毒的无效引用和短路表达评估错误或UB
- C 用于IF-Statments和while-loops的短路
- 短路评估与2017 C
- 如何使"短路评估"在"折叠表达式"中也可用?
- 是std :: any_of遵循短路逻辑所需的
- 当短路禁用常量表达式的计算时,是否允许在常量表达式中读取"一过一"指针
- 如何模拟短路和OpenCV
- 过载操作员短路 && 和 ||在C++17
- C/C++优化器是否可以决定延迟评估仅用于短路评估的值
- C++短路评估w.r.t优化
- 短路模板实例化
- 是否有任何合理的场景,程序员可能希望避免布尔表达式的短路计算
- 编译时是否需要短路评估规则
- 短路临时寿命