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

いいえ、変数はグローバルスコープで宣言されていないため、コンパイラはグローバルスコープでそれを移動できません。スコープはストレージと同じではありません。スコープは、変数にアクセスできる場所を示します。変数をグローバルスコープに移動すると、どこからでもアクセスできるようになりますが、ここではそうではありません。

プログラムの2番目の部分は、未定義の動作を示します。addrs関数の終了後にダングリングポインタが含まれます。std::set挿入時に既存のポインタを比較するため、これは不正です。ですから、そうだと思いますres2が、変化する可能性がありますが、UBのせいで、あなたが疑う理由ではありません。

于 2013-01-23T01:21:13.950 に答える