2

私が取り組んでいるプログラムでは、数十万の整数を含むテキストファイルから入力を読み取る必要があることがよくあります。とりあえず、私はいくつかの値を読み取り、それらをベクトルに格納しています。必要な値がベクトルにない場合は常に、入力ファイルから再度読み取り、古い値をフラッシュして、現在読み込んでいる値のためのスペースを確保します。

常に入力ファイルから読み取る必要があり、問題が発生する前にベクターにいくつの値を格納できるのか疑問に思っている状況を避けたいと思います。max_size()は1073741823を返すので、その数の要素を格納できると思いますが、そのメモリがどこで使用されているのか、そしてその大きなベクトルを使用するのが良いかどうか疑問に思っています。

そのようにベクトルを作成する場合:

int main(){
std::vector<int> vec;
vec.push_back(3);
vec.push_back(4);

return 0;
}

そのベクトルは現在スタックメモリを使用していますか?ベクトルには2つのintが含まれているので、8バイトのスタックメモリが使用されていることを意味しますか?

MSDNのドキュメントによると:

x86およびx64マシンの場合、デフォルトのスタックサイズは1MBです。

それは多くの記憶のようには思えません。スタックメモリを増やしたい状況の例は何ですか?Visual Studioで、現在使用されているスタックとヒープのメモリの量を正確に監視する方法はありますか?

このような状況で入力ファイルからの継続的な読み取りを防ぐためにできることはありますか?

4

2 に答える 2

4

そのベクトルは現在スタックメモリを使用していますか?

vecオブジェクトはスタック上にありますが、成長するにつれて内部的にヒープにメモリを割り当てます。

編集

また、すべてのファイルを読み取ってベクターに保存する代わりに、メモリマップトファイルを使用してみることができます。私が理解していること(自分で使用していないこと)から、カーネルモードでのページキャッシュとファイル読み取りの恩恵を受けるでしょう(OSがオンデマンドでファイルのロードを管理するため)。

これは、調査をどこで行うかについての単なる提案であることに注意してください(適切かもしれないと思いますが、メモリマップトファイルに精通していないため、詳細を説明できません)

于 2012-05-29T17:29:56.400 に答える
0

vector要素をスタックではなくヒープに格納します。本当に多くのヒープメモリを割り当てる必要があるかどうかは別の問題ですが、スタックを壊すことはありません。

于 2012-05-29T17:30:30.657 に答える