向局部变量添加 const 是否会影响其范围和编译器优化? [重复]

问题描述 投票:0回答:1

假设我有以下代码:

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();
}
c++ constants compiler-optimization
1个回答
2
投票

不,编译器无法在全局范围内移动它,因为该变量不是在全局范围内声明的。范围与存储不同。范围表示可以从何处访问变量 - 将其移动到全局范围意味着可以从任何地方访问它,但这里的情况并非如此。

程序的第二部分表现出未定义的行为。函数退出后,

addrs
包含悬空指针。因为
std::set
在插入时比较现有指针,所以这是非法的。所以我想说是的,
res2
可能会有所不同,但因为 UB,而不是你怀疑的原因。

© www.soinside.com 2019 - 2024. All rights reserved.