静的関数変数へのアクセスは、グローバル変数へのアクセスよりも遅いですか?

Dev Null:

静的ローカル変数は、最初の関数呼び出しで初期化されます。

static指定子を使用してブロックスコープで宣言された変数は、静的ストレージ期間を持ちますが、制御が最初に宣言を通過するときに初期化されます(初期化がゼロまたは定数初期化でない限り、ブロックが最初に入力される前に実行できます)。以降の呼び出しでは、宣言はスキップされます。

また、C ++ 11ではさらに多くのチェックがあります。

複数のスレッドが同じ静的ローカル変数を同時に初期化しようとした場合、初期化は1度だけ行われます(std :: call_onceを使用して任意の関数で同様の動作を取得できます)。注:この機能の通常の実装では、ダブルチェックされたロックパターンのバリアントを使用します。これにより、すでに初期化されたローカル静的のランタイムオーバーヘッドが1つの非アトミックブール比較に削減されます。(C ++ 11以降)

同時に、グローバル変数はプログラムの開始時に初期化されるようです(技術的には、割り当て / 割り当て解除のみがcppreferenceに記載されています)。

静的ストレージ期間。オブジェクトのストレージは、プログラムの開始時に割り当てられ、プログラムの終了時に割り当て解除されます。オブジェクトのインスタンスは1つだけ存在します。ネームスペーススコープで宣言されたすべてのオブジェクト(グローバルネームスペースを含む)には、この保存期間と、staticまたはexternで宣言されたオブジェクトがあります。

したがって、次の例を考えてみます。

struct A {
    // complex type...
};
const A& f()
{
    static A local{};
    return local;
}

A global{};
const A& g()
{
    return global;
}

f()それが呼び出されるたびにその変数が初期化されたかどうかをチェックする必要があるため、それf()よりも遅くなると仮定するの正しいg()ですか?

バトシェバ:

もちろんあなたは概念的に正しいですが、現代の建築はこれに対処できます。

最新のコンパイラーとアーキテクチャーは、パイプラインを調整して、すでに初期化されたブランチが想定されるようにします。したがって、初期化のオーバーヘッドにより、追加のパイプラインダンプが発生します。それだけです。

疑問がある場合は、アセンブリを確認してください。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

関数外のローカル変数へのアクセス

分類Dev

関数内でグローバル変数にアクセスできないのはなぜですか?

分類Dev

グローバル変数と名前空間変数へのアクセス

分類Dev

静的変数へのアクセス

分類Dev

JS:グローバル変数へのアクセスを防ぐにはどうすればよいですか?

分類Dev

関数変数へのアクセス

分類Dev

関数内で定義されたグローバル変数へのアクセス

分類Dev

関数内の静的変数へのアクセス

分類Dev

グローバルデータへのアクセスはローカルデータへのアクセスよりも高速ですか?

分類Dev

C ++の関数を使用してグローバル変数にアクセスするにはどうすればよいですか?

分類Dev

フィールド名でnamedtupleにアクセスするのが、クラスのメンバー変数にアクセスするよりも遅いのはなぜですか?

分類Dev

同じ名前の変数を持つ静的関数でグローバル静的変数にアクセスする方法

分類Dev

同じ名前の変数を持つ静的関数でグローバル静的変数にアクセスする方法

分類Dev

関数がグローバル変数にアクセスできない状況は何ですか?なぜ?

分類Dev

PHPは他の関数内の関数内のグローバル変数にアクセスします

分類Dev

グローバル変数 `environ`を介してアクセスできる文字列は、環境への変更を反映していませんか?

分類Dev

Pythonのモジュールおよびstaticmethods全体のグローバル変数へのアクセス

分類Dev

データコールバックコールバック関数からのDOM要素を保持するローカル変数へのreCaptchsアクセス

分類Dev

グローバル変数を使用せずに他の関数から変数にアクセスする

分類Dev

グローバル変数を作成せずに、別の関数から変数にアクセスする

分類Dev

関数内のグローバル変数にアクセスする方法

分類Dev

関数内のグローバル変数にアクセスする

分類Dev

関数内のグローバル変数は外部からアクセスできません

分類Dev

このグローバル変数にアクセスできないのはなぜですか?

分類Dev

グローバル変数の値にアクセスできないのはなぜですか

分類Dev

クラス内からグローバル変数を変更し、別のView Controllerでアクセスするにはどうすればよいですか?

分類Dev

Goの無名関数からグローバル変数にアクセスする方法は?

分類Dev

canvas.onmousemove関数の外部からグローバル変数にアクセスする方法は?

分類Dev

AsyncTaskからグローバル変数にアクセスできないのはなぜですか?

Related 関連記事

  1. 1

    関数外のローカル変数へのアクセス

  2. 2

    関数内でグローバル変数にアクセスできないのはなぜですか?

  3. 3

    グローバル変数と名前空間変数へのアクセス

  4. 4

    静的変数へのアクセス

  5. 5

    JS:グローバル変数へのアクセスを防ぐにはどうすればよいですか?

  6. 6

    関数変数へのアクセス

  7. 7

    関数内で定義されたグローバル変数へのアクセス

  8. 8

    関数内の静的変数へのアクセス

  9. 9

    グローバルデータへのアクセスはローカルデータへのアクセスよりも高速ですか?

  10. 10

    C ++の関数を使用してグローバル変数にアクセスするにはどうすればよいですか?

  11. 11

    フィールド名でnamedtupleにアクセスするのが、クラスのメンバー変数にアクセスするよりも遅いのはなぜですか?

  12. 12

    同じ名前の変数を持つ静的関数でグローバル静的変数にアクセスする方法

  13. 13

    同じ名前の変数を持つ静的関数でグローバル静的変数にアクセスする方法

  14. 14

    関数がグローバル変数にアクセスできない状況は何ですか?なぜ?

  15. 15

    PHPは他の関数内の関数内のグローバル変数にアクセスします

  16. 16

    グローバル変数 `environ`を介してアクセスできる文字列は、環境への変更を反映していませんか?

  17. 17

    Pythonのモジュールおよびstaticmethods全体のグローバル変数へのアクセス

  18. 18

    データコールバックコールバック関数からのDOM要素を保持するローカル変数へのreCaptchsアクセス

  19. 19

    グローバル変数を使用せずに他の関数から変数にアクセスする

  20. 20

    グローバル変数を作成せずに、別の関数から変数にアクセスする

  21. 21

    関数内のグローバル変数にアクセスする方法

  22. 22

    関数内のグローバル変数にアクセスする

  23. 23

    関数内のグローバル変数は外部からアクセスできません

  24. 24

    このグローバル変数にアクセスできないのはなぜですか?

  25. 25

    グローバル変数の値にアクセスできないのはなぜですか

  26. 26

    クラス内からグローバル変数を変更し、別のView Controllerでアクセスするにはどうすればよいですか?

  27. 27

    Goの無名関数からグローバル変数にアクセスする方法は?

  28. 28

    canvas.onmousemove関数の外部からグローバル変数にアクセスする方法は?

  29. 29

    AsyncTaskからグローバル変数にアクセスできないのはなぜですか?

ホットタグ

アーカイブ