私は、主にプロセッサに依存し、ヒープ使用量が重い(少なくとも数ギガバイト)科学アプリケーションを考えています。1年のどの時期でもC ++を喜んで使用しますが、この場合、C ++メモリマネージャーにとって自然な断片化がJavaの圧縮コレクターの利点と比較して重大な問題になるのではないかと思います。
誰もこれに関連する実世界の例を指すことができますか?
私は、主にプロセッサに依存し、ヒープ使用量が重い(少なくとも数ギガバイト)科学アプリケーションを考えています。1年のどの時期でもC ++を喜んで使用しますが、この場合、C ++メモリマネージャーにとって自然な断片化がJavaの圧縮コレクターの利点と比較して重大な問題になるのではないかと思います。
誰もこれに関連する実世界の例を指すことができますか?
回答:
マシンの制限にストレスをかけるようなアプリケーションについて話している場合、これらの制限を超えないようにするためにプログラミングのトリックを行うと予想される場合、C ++が最適です。C ++は(Emilioが指摘したように)Javaにはない最適化の余地を与えるだけでなく、Garbage-Collectorは非常にメモリを大量に消費する仕掛けであり、効率的に動作するために十分な空きメモリが必要です。
この質問への回答:StackOverflow:ガベージコレクションに必要な追加メモリ量は?かなり厳しい絵を描きますが、ガベージコレクタが割り当てられたメモリと同じくらいの空きメモリしか必要としない場合(これは私が聞いたものです)、これはまだJavaではまだ多くの空きメモリが必要であることを意味します効率的に実行するために。
一方、今日では、ハードウェアの制限を超えないようにするために、プログラミングトリックを実行するよりも、より高価なハードウェアを購入する方が一般的に好まれています。あなたの場合、RAMの問題は通常、64ビットマシンを使用し、必要なだけRAMモジュールを投入することで解決されます。ご存知のように、最近のハードウェアのコストは、先進国の開発時間のコストに近いものではありません。
このオプションを真剣に検討する必要があると思います。可能であれば、このオプションとC ++の代わりにJavaを使用してください。なぜなら、C ++よりもJavaで何かを開発する方がずっと簡単だからです。
問題はJavaであるためC ++を使用せず、C ++であるためJavaを使用しないことです。通常、C ++コンテナは、Javaの無料ストアが行うように、過剰な断片化を回避するために実装されます。
ただし、メモリを直接割り当てると、Javaで許可されていないこともできるため、フラグメンテーションが発生する可能性があります。
適切なソリューション(C ++)は、固定された「プレックス」によって割り当てを管理するアロケータークラスを通じてコンテナーとスマートポインターを使用することです(ここで重要なのは、適切なアロケータークラスを記述することです)。また、これはJavaとは関係のないプログラミングスタイルなので、比較は意味がありません。
[編集]これは時代遅れのサンプルになる可能性があります: 固定割り当て
ガベージコレクションの利点は、メモリの量が無限であるマシンをシミュレートすることです。その抽象化のメカニズムまたは実装は、プログラマーとして完全に透過的であることを意図しています。メカニズムがプログラムで使用されなくなったメモリを再利用していることは誰もが知っていますが、実際には保証されていません。プログラムが実際に使用するよりも多くのRAMを搭載したマシンでプログラムを実行すると、ガベージコレクションが発生しない場合があります。繰り返しますが、メモリの使用方法に関係なくプログラムを書くことができるため、無関係です。メモリマネージャーは、プログラムが要求するたびに、より多くのRAMを割り当てるだけであり、このような割り当ては常に成功すると想定できます。Javaはガベージコレクションされた言語ですが、C ++はそうではありません。1
ガベージコレクションの欠点は、すべての抽象化と同様に、漏れやすい傾向があることです。特にエッジの場合、常に完全に機能するとは限りません。バグに遭遇する可能性があります。最も一般的なケースに最適化されたガベージコレクションアルゴリズム(プログラマとしてあなたに透過的であるはずのアルゴリズム)を書いた人々は、一般的なケースでの問題は、それらがすべて共通ではないことです。一般的に、メモリの管理に関しては、ガベージコレクターよりも良いことはできません。しかし、特定の状況(および十分な量の時間、エネルギー、および理解が与えられた場合)では、それが可能かもしれません。C ++はこの柔軟性を提供します。Javaはしません。
それはすべて、言語を選択するための標準的なアドバイスがここに当てはまると思います。おそらく、この場合、制約が与えられればなおさらです。プロジェクトの主要な開発者に最も馴染みのある言語を選択してください。明白な理由(アプリをより速く、より効率的に開発できるようになるなど)に加えて、これは特にJavaをプログラミングしているようにC ++をプログラミングすると、メモリ管理が非常に非効率的になり、リークやクラッシュが発生するため、説明する場合に重要です。同様に、C ++でプログラミングしているようなJavaでのプログラミングはあまり役に立たず、ガベージコレクションアルゴリズムが微調整されて最も一般的なケースに合わせて調整されているため、最適化されていないプログラムを生成する可能性があります。
ガベージコレクション言語での作業に慣れているプログラマーは、ガベージコレクターと戦うのではなく、ガベージコレクターを信頼することを学びます。ガベージコレクションされた言語で作業している場合、これらはプロジェクトで必要なプログラマです。そうでないプログラマーガベージコレクションされた言語での作業に慣れていたのは、本質的にそのような「無限のメモリ」抽象化に懐疑的であり、多くの理由があります。これらのプログラマは良いかもしれませんが、ガベージコレクション言語で作業したい人ではありません他のタイプのプログラマーよりコード。せいぜい、彼らは車輪の再発明に多くの時間を費やすだけで、あなたに多くのお金を費やし、さらに長期的なメンテナンス費用を払うでしょう。
そして、あなたはそれが本当に重要かどうかを自問する必要もあります。Boのスナイドコメントには真実のヒント以上のものがあります:メモリは今とても安いので、あまり手で書く価値はほとんどありません。たとえ大量に必要な場合でも、それらの量は10年前ほどではありません。プログラマーとアプリケーション開発は、RAMと処理能力を大量に購入するよりもはるかに高価です。それは、可能な限り経済を避ける必要があるという意味ではありませんが、それを行うのに時間をかけすぎないことを意味します。
1もちろん、この仮定は問題のより深い欠陥を浮き彫りにします。結局のところ、「JavaまたはC ++」はちょっとしたニシンです。標準のJava実装はガベージコレクションを提供し、C ++は言語標準に準拠していませんが、サードパーティのガベージコレクタをC ++に使用できなかった理由はまったくありません。多くの企業がこれらのものを売って生計を立てており、おそらくいくつかは無料でそれらを配って生計を立てています。