2017-08-28 14 views
-4

私は、以下のようなC言語の既存のソースコードを持っています。C++の静的な内部関数とC++の静的関数の違いは?

bool getFlag(int param) 
{ 
    static bool flag = false; 
    if(param == 1) 
    flag = true; 
    return flag; 
} 

I have written the C++ version of the same as below. 
class MyClass 
{ 
    public: 
    static bool getFlag(int param) 
    { 
     if(param == 1) 
     flag = true; 
     return flag; 
    } 
    private: 
    static bool flag; 
}; 

上記2つのコードスニペットの違いは何ですか? 上記のC++コードは、どのような点でもCコードよりも利点がありますか?

+0

Cコードも完全に優れたC++コードであることに注意してください。 –

+0

なぜこれをやったのですか?オリジナルの関数はそのままです。 1つの静的関数と静的メンバーを持つクラスは値を追加しません。また、コード行で支払いを受けていない限り、これを行う理由はありません。例えば、同じ質問が異なる言い方をしていることに注意してください(C++の2つのアプローチの違いがあります)。 – SergeyA

+2

[C++、静的ローカル変数(メソッド)とグローバル(ファイル)変数の違いは何ですか?](https://stackoverflow.com/questions/31578571/c-what-is-difference-between-static- – rustyx

答えて

0

多少類似しています。 MyClassクラスのインスタンスと対話する人は、同じ変数フラグと対話します。

同じことがあなたの機能に当てはまります。呼び出し元はすべて同じ静的変数と対話します。

しかし、いくつかのあいまいさは、彼らがあなたのコンパイラに応じて、マルチスレッド環境でどのように動作するかに間違いがある(新しいコンパイラで、純粋なC言語の関数または混合C/C++をコンパイルしている?)

基本的には、初期化はC++ 11より前のスレッドセーフではなく、2つのスレッドがローカル静的変数の初期化(または後続の変更)に達した場合、データ競合が発生します。これは、Microsoft側のVisual Studio 2015までずっと存在していました。

したがって、現代のコンパイラでは、C++の動作が異なります。

https://stackoverflow.com/a/11711991/128581

変数 が初期化されている間に制御が同時に宣言を入力した場合、同時実行は、初期化の完了 を待たなければなりません。

0

コンテキスト全体がないと、どちらが良いかは分かりません。抽象化の問題です。アセンブリレベルでさえ違いは分かりませんが、静的変数はどちらの場合も.BSSセグメントに移動します。ロジックはまったく同じです。メソッドが静的であるため(これは唯一のメソッドであると仮定しているため)隠された"this" argumentを利用していないか、あるいはいつでもコンストラクタ呼び出しを持っています。 デバッグモードでコードをコンパイルして生成された名前の解釈を行うだけで、違いを知ることができます。

関連する問題