2017-04-07 17 views
0

次のインライン関数が複数の翻訳単位で呼び出された場合、正確に何が起こっているのか興味があります。インライン関数の静的変数

namespace some_name 
{ 
    inline const float& get_float() 
    { 
     static const float a = 5.0f; 
     return a; 
    } 
} 

私の意図は、(名前空間を持つヘッダが含まれている場合)、コード全体で使用することができ、「」外部リンク変数を作成することでしたが、また、私は、この変数に何らかの変化を防止したかったです。テストから、私は成功したようですが、私はこの関数を初めて呼び出すとき、次に何度も呼び出すときに何が起こるのかに興味があります。

その他の質問:静的変数宣言/定義でグローバルな名前空間を汚染していますか?

+1

static const floatを返す関数を作成する代わりに、それをクラスのメンバ変数または名前空間のメンバ変数にするだけではいかがですか。それはまだconstです... – UKMonkey

+0

UKMonkey私はそれが好きなら、私は別の翻訳単位で変数を使用するたびにconst float型のコピーを取得するたびに私は確信していませんでした。 – user3271640

+1

このように 'a'が外部リンクされていると確信していますか?そしてなぜあなたは外部リンクされた定数が必要なのでしょうか?外部リンケージは、複数のコンパイル単位が変数の1つのインスタンスを共有し、変更されたときにすべてのユニットが更新された値を読み取ることを示唆しています。しかし定数は変化するとは考えられない。さらに、多くの場合、コンパイラは定数値を命令に直接埋め込むため、メモリには表示されません。 –

答えて

0

しかし、私は最初にこの関数を呼び出してから数回次の関数を呼び出すときに何が起こるのかに興味があります。

初期化は静的であり(実行時には何も依存しません)、プログラムの開始時に実行される可能性があります。すべての呼び出しは、単に静的オブジェクトへの参照を返します。これらの呼び出しはおそらくインライン展開されているので、静的オブジェクトを直接使用してください。

より簡単なオプションは、名前空間でグローバル変数を使用することです。

その他の質問:静的変数宣言/定義でグローバルな名前空間を汚染していますか?

いいえ。静的変数はローカルなので、名前空間を汚染しません。関数自体は宣言されている名前空間を「汚染」します。

+0

名前空間内の 'static'変数は、逆を行います。つまり、ヘッダを含むTUごとにそのような変数を1つ定義します。 – Quentin

+0

@Quentinええ、私はグローバル変数(つまり、静的ストレージを持つ非ローカル変数)を意味しました。しかし、それは定数とは関係ありません。なぜなら、異なるコンパイル単位からの複製がとにかく押しつぶされているからです。 – user2079303

+0

@Quentinこれはまさに私が興味があることです。そのため、私は名前空間に変数を定義しませんでした。私はこのヘッダーを含むすべてのTUで特定の1つの静的オブジェクトを直接使用したいと思います。 – user3271640

関連する問題