假设我有以下代码:
int foo () {
int const x = 0;
return x;
}
编译器是否允许将 x 移至全局作用域?
下面的场景呢?
res2
会因优化而变化吗?
std::set<int const *> addrs;
int foo () {
int const x = 0;
addrs.insert(&x);
return addrs.size();
}
void bar () {
int res1 = foo();
int res2 = foo();
}
不,编译器无法在全局范围内移动它,因为该变量不是在全局范围内声明的。范围与存储不同。范围表示可以从何处访问变量 - 将其移动到全局范围意味着可以从任何地方访问它,但这里的情况并非如此。
程序的第二部分表现出未定义的行为。函数退出后,
addrs
包含悬空指针。因为 std::set
在插入时比较现有指针,所以这是非法的。所以我想说是的,res2
可能会有所不同,但因为 UB,而不是你怀疑的原因。