2

staticストレージはコンパイル時に決定されます。ただし、関数に遅延初期化がたくさんあるシナリオを考えてみましょう。

void foo ()
{
  static int a[1000];
}

ここではコーディングの実践についてではなく、技術的な側面について説明します。のような他の多くの関数 foo()が実行されると、それらの多くのstatic変数がデータセグメントに導入されます。

コンパイラは、データセグメントにスペースを割り当てるときに、アカウントでも遅延初期化を行いますか。「いいえ」の場合、コードの実行中に実行時にセグメンテーション違反が発生しますか?(メソッド内に多くのstaticデータがある場合に発生する可能性が高くなりtemplateます)。

4

4 に答える 4

5

初期化が遅延しているからといって、割り当てはそうではありません。標準では、プログラムの開始前にすべての静的変数 (ローカル変数を含む) をゼロ初期化する必要があります。実際、静的とは、(この場合) まさにそれを意味します。変数のスペースは、プログラムの存続期間全体にわたって存在します。

于 2011-07-12T09:40:20.233 に答える
3

1) 1 つのことに対して「多くの」変数が存在することはありません。関数/メソッドスコープの静的変数は、グローバル変数に非常に似ています。

2)他のすべてのグローバル変数とともに、アプリの起動時に初期化される可能性が最も高いため、遅延初期化はありません。

3) 失敗の理由がわかりません

静的 (C++) の詳細を読む

編集:ゼロ化に関する記述を削除

于 2011-07-12T09:42:26.660 に答える
2

そのような多くのfoo()が実行されると、それらの多くの静的変数がデータセグメントに導入されます。

いいえ。1つしか取得できませんfoo()::a。それが全体のポイントです。

コンパイラは、データセグメントにスペースを割り当てる際に、アカウントでも遅延初期化を行いますか。「いいえ」の場合、コードの実行中に実行時にセグメンテーション違反が発生しますか?(テンプレートメソッド内に多くの静的データがある場合に発生する可能性が高くなります)。

オブジェクト.dataが多すぎる場合、セクションのスペースが不足するかどうか(したがって、セクションにさらに書き込むと破損エラーが発生する可能性があります)を尋ねているようです。static

さて、上記のように、コンパイル時に静的ストレージに必要なスペースの量がわかっています(関数テンプレートのインスタンス化にも)。関数を呼び出すたびにそれ以上取得するわけではないため、必要なスペースの量を決定するための実行時要素はありません。foo()::a

于 2011-07-12T09:39:28.027 に答える
0

簡単な答え: いいえ、segfault は発生しません。

以下の例でabcは、 はデータ セグメントにあり、defxは BSS にあります。

#include <iostream>

int abc = 123;
int def;

int foo (int i) {
    static int x (i);
    return x;
}

int main () {
    std :: cout << foo (100) << " " << foo (200);
}

この例では、「100 100」が出力されます。関数スコープstaticオブジェクトの初期化は、最初の呼び出し時にのみ発生します。

のストレージxは、 のようなグローバル変数の場合と同じdefです。

テンプレートは基本的に同じですfooが、テンプレートによってパラメーター化されている場合はx、インスタンス化ごとに 1 つ存在します。

于 2011-07-12T09:52:44.970 に答える