問題タブ [memory-pool]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - アロケータの deallocate() が noop の場合、STL コンテナを破棄せずに使用できますか?
タイトル長くてすみません〜
deallocate()
空のメモリ プールの上に単純なアロケータを実装しています。STL コンテナーがこのアロケーターと共に使用され、コンテナーの要素が自明に破壊可能である場合、コンテナーのデストラクタを完全に呼び出さないようにすることはできますか?
標準はおそらくノーと言いますが、私にはわかりません。IMO、この動作が許可されている場合、STL コンテナーはアロケーターから割り当てられたメモリ以外のリソースを取得できず、STL ベンダーを制限しすぎます。私は標準の専門家ではありません。間違っていることが証明されれば幸いです。
ただし、単純なアロケータを libstdc++ や libc++ などの実際の実装と一緒に使用すると、プログラムでメモリ リークが発生したり、他の問題が発生したりしませんか?
c - セグメンテーション違反を引き起こす C memcpy
そのため、大学の課題の一部として単純なメモリ プールを実装しようとしていますが、割り当てたメモリ内に値を格納する際に問題が発生しました。
これは私の main.c ファイルです:
私の Pool.h ファイル:
そして私の Pool.c ファイル:
この問題は、memcpy を呼び出す行を含む「store_in_pool」を呼び出すたびに発生します。関数に正しい値を渡していることは確かなので、問題が何であるかはわかりませんが、プログラムを実行しようとするたびにセグメンテーション違反が発生します。
問題の原因は何ですか?
c++ - マルチスレッド ベクトル (LFSV) 用の適切なメモリ プールを作成するにはどうすればよいですか?
以下は、私の大学で教えられなくなったクラス (並列処理) の古い演習です。目標は、メモリ バンクを作成して使用し、ロックフリー ソート ベクターの実装を高速化することです。私はメモリ バンクを自分で実装しました。目標は、使用するのに十分なメモリを確保して、LFSV で new または delete を使用する必要がないようにすることです。メモリのアドレスを返す Get() 関数が必要であり (未使用のメモリを追跡する方法がわからない)、Store がメモリを解放する (どういうわけか未使用としてマークする) 必要があると思います。
LFSV (私の介入前は問題なく動作していました) の内部では、new と delete を new replacement と Store (解放したいメモリ) に置き換える必要があることを演習で説明しています。Get (これが正しくない場合) または Store 関数を作成して、適切なメモリ バンクのように実行するにはどうすればよいですか? また、メモリ バンクとマルチスレッドに関連する適切なリソースを見つけるのに苦労しているため、あなたが知っている可能性のある参照またはメモリ バンクの例をオンラインで取り上げます。
このプログラムにエラーはありませんが、メモリ バンクを適切に管理していないため、「FAIL」と返されます。
memory-management - 配列のサイズを変更せずに任意のサイズのベクトルを埋める慣用的な方法は?
必要なデータ量を前もって知らずにデータを割り当てたい場合があります。
ほとんどのベクトルはそのままで問題ありませんが、メモリ チャンクのチェーンを割り当て、必要に応じて新しいチャンクを作成する方が効率的な場合があります。
インデックスで直接アクセスする必要がない場合 (たとえば、最後の項目のみをポップする場合)、メモリ チャンクとして保持できます。それ以外の場合は、これが完了すると、固定サイズのベクトルを割り当てて、データをそこにコピーできます。
これは Rust でLinkedList
ofVec
を使用して実行できますが、このタスクを実行するためのより慣用的な方法はありますか?