2016-09-11 6 views
0

としてグローバル変数を扱う作る:あなたが見ることができるように、コンパイラがglobalBarconstであると仮定するためC++:私は次のセットアップ持っている関数はconstの

Foo.cpp

class Bar { 
public: 
    inline Bar() : x(0), y(0), z(0) {} 
    inline Bar(int X, int Y, int Z) : x(X), y(Y), z(Z) {} 
    const int x, y, z; 
}; 

static Bar globalBar; 

static void foo() { 
    int x = globalBar.x; // the compiler should assume globalBar is const here! 
    ... 
} 

void almightySetup() { 
    globalBar = Bar(meaningOfLife(), complexCalc(), magic()); 
    startThread(foo); // foo() will NEVER be called before this point! 
    // globalBar will NEVER be changed after this point! 
} 

すると、それは安全です示された点は、セットアップ後にその時点以降に変更されることはないため、globalBarが変更されることはありません。さらに、foo()はセットアップ前に呼び出されません。

しかし、これをどのように達成できますか?私はconst_cast<>を使用しようとしましたが、タイプエラーメッセージを受け取り続けます。私は間違ったことをする必要があります。それも可能ですか?

私はfooの機能署名を自由に変更することはできません。

+0

コンパイラは何も想定しません。コンパイラは、コードの記述に従ってコードをコンパイルします。オブジェクトが 'const'として宣言されている場合、コンパイラはそれを' const'オブジェクトと見なします。オブジェクトが 'const'として宣言されていない場合、コンパイラはそれを' const'オブジェクトと見なしません。終わり。 –

+1

コンパイラが 'globalBar'が' foo() 'の' const'であると仮定するのはなぜ重要ですか? – Cornstalks

+0

最適化の理由から。私はこのコードで遊ぶサイクルがほとんどありません。 – bombax

答えて

0

これは理論的な例です。私はそれをテストしていませんが、C++の専門家からの意見が大好きです。これは効果がありますか?

static Bar globalBar; 

static void foo() { 
    static const Bar myGlobalBar = globalBar; 
    int x = myGlobalBar .x; // the compiler should assume globalBar is const here! 
    ... 
} 
+1

'myGlobalBar'は' const'ですが、 'globalBar'のコピーでもあります。おそらく 'const'リファレンスがうまくいくでしょうか?私は初期化の順序があなたをかむために戻ってくるとは思わない。 –

関連する問題