8

C ++で記述されたプログラムの場合、データを含む文字列の2つの巨大な配列が必要です。

これらは、ヘッダーファイルで次のように定義されています。

#include <string>
static const string strdataA[30000]={"this is the first line of the data",
    "the second line of data",
    "other stuff in the third line",

至るまで

    "last line."};
//second array strings
static const string strdataB[60000]={"this is the first line of the data",
    "the second line of data",
    "other stuff in the third line",

至るまで

    "last line."};

しかし、これをg ++でコンパイルすると、時間がかかりすぎて、完全ではありません。また、約2GBの仮想メモリを使用します。そこで、strdataB []をコメントアウトすると、プログラムはコンパイルされましたが、それでもしばらくしてからです。実行可能ファイルはわずか約8Mbで、正常に動作しました。

コンパイルプロセスをスピードアップするために何ができますか?コードを変更する必要があるかどうかは気になりませんが、外部ファイルを使用してロードする必要はありません。プログラム内で非常にうまく機能する配列が欲しいのですが。

ネットのどこかで「staticconst」がうまくいくはずだと読んだのですが、経験からそうではないことがわかりました。

提案を事前に感謝します!

4

3 に答える 3

9

そのために使用するべきではありませんstd::string。代わりにプレーンオールドを使用してくださいconst char*

const char * const strdataA[30000] = {
    "one",
    "two",
    //...
};

ここstaticでは、キーワードが大きな違いを生むことはありません。

このように、文字列自体は単純なリテラルとして読み取り専用データセクションに格納され、配列自体は単純にポインタの配列になります。また、実行時に文字列コンストラクタ/デストラクタを実行することは避けてください。

于 2013-03-14T21:57:55.530 に答える
3

これらはGCCの既知の問題だと思います。使用しているGCCのバージョンはわかりません。おそらく、GCCの最新の安定したリリースを試して、改善されるかどうかを確認する必要があります。

おそらく、すべての文字列をソースコードに保持するべきではありません。おそらく起動時などに外部ファイルからロードする必要があります。

于 2013-03-14T21:52:26.863 に答える
1

コンパイルプロセスをスピードアップするために何ができますか?

const char* strdataA ...コンパイルプロセスをスピードアップする必要があります。現在のバージョンでは、g++はすべての文字列に対してコンストラクター呼び出しの膨大なリストを作成する必要があるためです。

于 2013-03-14T22:00:14.070 に答える