1

プロジェクトのために、私はstd::unordered_map. 残念ながら、マップ全体をハードコーディングするしかありません。そこで、初期化を複数のファイルに分割することにしました。

class OpeningBook
{
public:
    OpeningBook();
private:
    std::unordered_map<std::string, int> opening_database_;
    void init1();
    void init2();
    void init3();
    void init4();
    void init5();
};

コンストラクターはinit関数を呼び出すだけです。

OpeningBook::OpeningBook()
{
    init1();
    init2();
    init3();
    init4();
    init5();
}

これらはすべて次のようになります。

void OpeningBook::init1()
{
    opening_database_.insert(std::pair<std::string, int>("0001000000-10000001000000-1000001100000-1-1000",5000));
    opening_database_.insert(std::pair<std::string, int>("0001000000-10000001000000-1000000100000-1-1100",5000));
    opening_database_.insert(std::pair<std::string, int>("0001000000-10000001000000-1000000100001-1-1000",5000));
    opening_database_.insert(std::pair<std::string, int>("0001000000-10000001000000-1000000100000-1-1010",5000));
    opening_database_.insert(std::pair<std::string, int>("0001000000-10000001000000-1000000100010-1-1000",5000));
    opening_database_.insert(std::pair<std::string, int>("0001000000-10000001000000-1000000100000-1-1001",5000));
    opening_database_.insert(std::pair<std::string, int>("0001000000-10000001000000-100000010000-11-1000",0));
    opening_database_.insert(std::pair<std::string, int>("0001000000-10000001000000-100000010000-10-1100",5000));
    // continues
}

ただし、コードが の左中かっこに到達するとすぐにinit1()、スタック オーバーフロー例外がスローされます。unordered_mapがヒープ上にあるので、スタックオーバーフローは起きないと思っていました。どうしたの?これを修正するにはどうすればよいですか?

4

1 に答える 1

4

initx()各メソッドにいくつの項目を挿入していますか? 数千の場合、コンパイラがスタック上で多数の一時変数を使用するコードを生成し、使用可能なスタック領域よりも多くのスタック領域を要求する可能性があります。

初期化方法をさらに分割してみて、問題が解決するかどうかを確認してください。

より良いアプローチは、初期化データを含むテーブルを持つことです:

static const struct {
    const char *str;
    int n;
} DatabaseInitData[] = {
    {"0001000000-10000001000000-1000001100000-1-1000",5000},
    {"0001000000-10000001000000-1000000100000-1-1100",5000},
    {"0001000000-10000001000000-1000000100001-1-1000",5000},
    // etc
};

次に、コンストラクターで次のようにします。

OpeningBook::OpeningBook()
{
    for (int i = 0; i < sizeof(DatabaseInitData)/sizeof(DatabaseInitData[0]); i++) {
        opening_database_.insert(std::pair<std::string, int>(
            DatabaseInitData[i].str,
            DatabaseInitData[i].n));
    }
}
于 2012-11-21T20:12:48.527 に答える