C++ を使用して作成された大規模なサーバー アプリケーションに取り組んでいます。このサーバーは、おそらく数か月間、再起動せずに実行する必要があります。時間の経過とともにメモリ消費量が増加するため、断片化はすでに疑わしい問題です。これまでの測定は、プライベート バイトと仮想バイトを比較し、これら 2 つの数値の違いを分析することでした。
断片化に対する私の一般的なアプローチは、分析に任せることです。一般的なパフォーマンスやメモリの最適化など、他のことについても同じように考えています。分析と証明で変更をバックアップする必要があります。
コードのレビューやディスカッション中に、メモリの断片化が最初に発生する問題の 1 つであることによく気づきます。現在、それに対する大きな恐怖があり、事前に「断片化を防ぐ」ための大きなイニシアチブがあるようです. メモリの断片化の問題を軽減または防止するのに有利と思われるコードの変更が要求されます。これらは私には時期尚早の最適化のように見えるので、すぐにこれらに反対する傾向があります。コードのクリーンさ/読みやすさ/保守性などを犠牲にします。これらの変化を満たすために。
たとえば、次のコードを見てください。
std::stringstream s;
s << "This" << "Is" << "a" << "string";
上記で、stringstream がここで行う割り当ての数は定義されていません。4 つの割り当て、または 1 つの割り当てである可能性があります。したがって、それだけに基づいて最適化することはできませんが、一般的なコンセンサスは、固定バッファーを使用するか、何らかの方法でコードを変更して、潜在的に少ない割り当てを使用することです。ここで文字列ストリームがメモリの問題の大きな原因になっているとは思えませんが、間違っているかもしれません。
上記のコードに対する一般的な改善提案は、次の行に沿っています。
std::stringstream s;
s << "This is a string"; // Combine it all to 1 line, supposedly less allocations?
また、可能な限りスタック オーバー ヒープを使用するという大きな推進力もあります。
このようにメモリの断片化を先取りすることは可能ですか、それともこれは単なる誤った安心感ですか?