0

假设我有以下代码:

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();
}
4

1 回答 1

2

不,编译器不能在全局范围内移动它,因为变量没有在全局范围内声明。范围与存储不同。范围表示可以从哪里访问变量 - 将其移动到全局范围意味着可以从任何地方访问它,这里不是这种情况。

程序的第二部分表现出未定义的行为addrs函数退出后包含悬空指针。因为std::set在插入时比较现有指针,所以这是非法的。所以我会说是的,res2可能会有所不同,但因为UB,而不是你怀疑的原因。

于 2013-01-23T01:21:13.950 回答