mp4 ビデオを YUV フレームにデコードしようとしています。デコードするフレームごとにメモリを割り当てたいのですが、連続してメモリを割り当てて解放してもよろしいでしょうか。そうすることに問題はありますか (つまり、 and を使用してメモリを論争的に割り当てたり解放しmalloc
たりしますfree
)?
4 に答える
一度十分なバッファを割り当てて、同じバッファを再利用する方がよいでしょう。いくつかのパフォーマンス ヒットを除けば、malloc-free を繰り返しても問題はありません。
技術的には、解放済みのメモリにアクセスしようとしない限り、まったく問題ありません。
一方、これらすべての呼び出しを繰り返し行うと、事前に十分な量のメモリを割り当てて、最後にすべて解放することで回避できる (そして避けるべき) オーバーヘッドが発生します。
割り当て/解放を繰り返すアプローチは、メモリの制約が非常に厳しい場合にのみ使用する必要があります。それ以外の場合は、メモリの大きなブロックを予約し、必要に応じてその一部を割り当てます。または、可能であれば、同じメモリ チャンクを再利用します。
更新: @EricPostpischil が有益なコメントで述べたように (以下を参照)、malloc はライブラリ呼び出しであり、現在のヒープが使い果たされたときにのみ発生するシステム呼び出しではありません。詳細については、この説明を参照してください
割り当てるオブジェクトのサイズが同じであれば、パフォーマンスに大きな影響はありません。疑問がある場合は、測定してください。
多くの場合、割り当てられたメモリを正しく追跡することは簡単ではないため、バッファを一度割り当てて、プログラム全体でこれを使用する方がおそらく簡単です。ただし、ここでの原則は、プログラムのロジックに対応するものを使用することであり、最も読みやすく維持しやすいものを使用する必要があります。
常に mallocing と freeing を実行してもプログラムが壊れることはありませんが、多くのパフォーマンスの問題が発生します。これは、特にフレームごとに実行することになるためです。顕著なパフォーマンスの低下を引き起こすことが多い、mallocing と freeing。
できることは、メモリを 1 回だけ malloc し、各フレームに同じ割り当てを再利用することです。次のフレームが読み込まれる前に、フレームで必要なことを行った後、メモリを保存する必要がない場合は、問題はありません。