2017-06-11 13 views
3

私の新しい職場では、コードにはPimplイディオムが多用されており、その理由はコンパイル時間を短縮するためです。しかし、私は基本的な質問があります - pimplはメモリの動的割り当てを必要としませんか?したがって、必要以上にヒープに多くのメモリを割り当てています。そして、それがたくさん使われてしまうと、より多くのメモリを使用することになります。 それを使用することをお勧めしますか?Pimplイディオムのメモリ使用量

+3

余分なメモリオーバーヘッドは、実際のポインタ変数自体です(32ビットまたは64ビットシステムをターゲットにしているかどうかに応じて、4バイトまたは8バイトになります)。とにかくどこかに構造物のデータを格納しなければなりません。おそらくパディング用の2バイトです。あなたがメモリ不足の状況に遭遇し始める場合を除いて、心配する必要はほとんどありません。(おそらくどこか他の場所を探しているはずです) –

+2

@Someprogrammerdude - 標準グローバルアロケータを使用すると、簿記のオーバーヘッドが発生します。コスト/報酬分析は、実際には、ピンプル自体のサイズに依存する。カスタムの小さなオブジェクトアロケータが順番に並ぶかもしれません。 – StoryTeller

+0

@StoryTeller本当ですが、私はまだそれはほとんどの状況で象の銃で飛んで飛ぶようなものだと思います。 –

答えて

2

...理由は、コンパイル時間を短縮するためです。

Is the pImpl idiom really used in practice?で提案されているようにあなたが(「再コンパイル時間は本当に唯一のソースファイルを再構築する必要があるため、減少したが、ないヘッダ、およびそれを含んでいるすべてのファイルは」、私は推測再コンパイル時間を言うことを意味し)。

メモリを動的に割り当てる必要はありませんか?

実際にはポインタは必要ですが、静的であるかどうかにかかわらず、ポインターは何かを指すように設定できます。詳しくはPimpl idiom without using dynamic memory allocationをご覧ください。

多く使用されていると、さらに多くのメモリを使用してしまいます。

まあ、オーバーヘッドはポインタ(4または8バイト)に起因します。データはどこかの場所に格納しなければならず、この "どこか"が静的であるかどうかにかかわらず、メモリはほとんど同じです。

メモリが動的に割り当てられると、システムはオーバヘッドで発生するいくつかのハウスキーピングを行う必要があるため、私はほとんど言っていませんでした。

ただし、Pimpl Idiomを使用したため、メモリが不足することはほとんどありません。そうすれば、問題はどこか別のところで起こり、あなたはそのイディオムもなくメモリから外に出るでしょう。


PS:juanchopanzaが述べたように、Memory Fragmentation( "あなたの記憶のほとんどは非連続ブロック、またはチャンクの多数に割り当てられているとき - あなたの総メモリの未割り当ての良い割合を残しますが、使用できないほとんどのため通常のシナリオ ")も考慮に入れる必要があります

+2

メモリの断片化もあります。 – juanchopanza

+0

右@juanchopanzaは私の答えを更新しました、ありがとう! – gsamaras