12

私は現在、64 KB の SRAM を搭載した ARM Cortex M3 プロセッサを使用して組み込みシステムを構築中です。現時点では、STL コンテナーで決定論的なパフォーマンスを確保する方法を探しています。これには、実行時にメモリ不足にならないようにすることも含まれます。

私は主に、STL コンテナーが動的メモリ割り当てを実行する方法に関心があります。カスタム アロケータを使用して、これらの構造体が確保したプールからメモリを取得することはできますが、構造体の 1 つのインスタンスが別のインスタンスのスペースを占有できないようにするために、構造体ごとに個別のプールをセットアップする必要があります。

私はこのプロジェクトで、メモリの未加工の割り当てに関心がなく、「よく知られている」データ構造 (スタック、キュー、デキューなど) を利用できることを好む他の個人と協力しています。したがって、私は現在、これらの構造を提供するために C 配列のラッパーを構築することを検討しています。これにより、これらのコンテナーをサポートするために必要なメモリーの静的割り当てが可能になり、他の開発者は、コンパイラーによって提供されるコードサイズ情報に基づいて、実行前にインスタンス化したコンテナーのサイズを知ることができます。私の意見では、これにより実行時にメモリ不足の問題が発生しないことが保証され、システム設計が大幅に簡素化されます。

もう 1 つのオプションは、システムの初期化時に STL コンテナーを割り当てることです。初期化期間の後、追加の動的メモリ割り当ては発生しません。ただし、私の知る限り、標準の C++ STL データ構造はこれをサポートしていません。スタックなどのコンテナーを事前に割り当てることができる必要があります (ベクターに似ています)。

標準 C 配列を中心にクラスを構築するという私の提案について、何かコメントをいただければ幸いです。さらに、静的サイズのスタックやキューなど、静的サイズの STL コンテナーをコンパイル時に割り当てる簡単な方法はありますか? (これはベクトルで可能であることは知っていますが、他のものはわかりません)

注: 別の質問 ( Embedded C++ to use STL or not ) を読みましたが、この質問の作成者は、メモリの量 (ARM7 プロセスの使用方法以外) を明らかにしていませんでした。私に似た解決策を検討しています。

2 番目の注意: 一部の開発者にとっては、64 KB の SRAM が大量のメモリに見えるかもしれません。実際、メモリが大幅に少ない AVR プロセッサで開発を行ったことがあるので、この観点は理解できます。しかし、私の現在の (おそらく無知な) 見方からすると、STL コンテナーについて話す場合、64 KB のメモリはそれほど多くはありません。

4

3 に答える 3

10

この質問はちょっと混乱していて奇妙です。まず、いくつかの誤解を解いてみましょう。

名前で「スタック、キュー、デキュー」に言及しています。さて、これらのうちの 2 つはコンテナではありません。stackおよびqueueコンテナ アダプタです。ほら、実際には要素を直接保存しません。それらは、それらへのインターフェースを仲介するだけです。stack最上位の要素のみをプッシュ、ポップ、および取得できるようにします。queueプッシュバック、ポップフロント、およびフロント要素のみを取得できるようにします(バック要素も取得できると考えていました)。

コンテナー アダプターは、実際にテンプレート パラメーターの 1 つとして、実際に使用するコンテナーの種類を受け取ります。したがって、必要に応じて astackと a を使用できstd::listます。(ユースケースによっては)必ずしもお勧めしませんが、可能です。

コンテナー アダプターはメモリを気にしません。メモリを割り当てるのは、彼らが使用するコンテナです。

このようにメモリが厳しく制限されたシステムで実行している場合、標準のコンテナーが非常に使いやすいとは思えません。アロケーターを使用して固定サイズのメモリ バッファーを提供したとしても、実際のコンテナーがより多くのメモリを割り当てるのを止めるためにそれらのアロケーターができる唯一のことは、例外をスローすることです。

たとえば、vector2KB のメモリ内で動作する必要がある があり、そのサイズが 1KB で、さらに 2.5KB を割り当てようとすると、アロケータは単純に 2KB を返すことはできません。要求に応じて 2.5KB を返すか、throw std::bad_allocすることができます。これらはあなたの唯一の2つのオプションです. アロケータが、vector持っているメモリよりも多くのメモリを取得できるが、必要なだけではないことを に伝える方法はありません。

同様に、アロケータは、新しいメモリ、コピー先として新しく割り当てられたメモリを提供する必要があります。より多くのメモリを使用できる場合にのみ、メモリの同じスポットを提供することは想定されていません。これを行うと、一部の実装で問題が発生する可能性があります。

アロケータは、アクセス用にメモリのさまざまな領域を提供することを目的としています。コンテナー自体のサイズを制限するように設計されていません。

私の提案は、 EASTL のコピーを追跡することです。それは本当にこの種のもののために設計されています。リンク先の Github リポジトリにはいくつかのバグ修正などがありますが、ほとんど同じです。悪いコードではありません。それらの STL のようなコンテナーは、ほとんどのインターフェースを提供するため、ほとんどの場合、ドロップインの代替品になります。ただし、メモリ割り当てを具体的に制御するための特別な機能を提供します。

于 2012-03-08T04:27:25.587 に答える