質問

c ++を使用して、組み込みシステム上のWindows CE 4で実行されるアプリケーションを開発しています。

制約の1つは、アプリケーションで使用されるすべてのメモリが起動時のみに割り当てられることです。新しいものを割り当てる代わりに、事前に割り当てられたメモリのみを使用する多くのコンテナとアルゴリズムを作成しました。

これらの条件で、独自のコンテナの代わりにブーストライブラリを使用することは可能だと思いますか?

コメントやアドバイスを歓迎します!

どうもありがとう、

ニック

役に立ちましたか?

解決

コンテナの独自のアロケータを記述して、固定サイズの静的バッファから割り当てます。コンテナーの使用パターンに応じて、アロケーターはポインターをインクリメントするだけの単純なものになります(たとえば、アプリの起動時に一度だけのものをコンテナーに挿入し、継続的に要素を追加/削除しない場合)。

他のヒント

組み込みシステムにブーストを使用します。ブーストを使用すると、使用するものを選択して選択できます。すべてのプロジェクトで smart_ptr および boost :: bind を使用しています。 安価な携帯電話用のソフトウェアを作成しています。 また、Windows CEがハードウェアで実行できる場合、一部のブーストが適用可能になると思います。 ブーストには割り当てのない部分があり、それらが役立つ場合があります。

要件に基づいて選択して選択します。

使用するものと同様に、コストを知る必要があります。

Boostコンテナーでコンテナーを置き換えることはお勧めできません。適切なカスタムアロケータを作成する作業はそれほど悪くはありませんが、「起動時に割り当てる」ルールの精神に違反することになります。 (私の経験では)このルールの背後にある考え方は、一般に、実行時にメモリ不足の状況に対処する必要がないことを確認することです。アイデアは、最初から右に必要な可能性のあるすべてのメモリを確保し、システムの一部が後でメモリ不足になる可能性がないようにすることです。

カスタムアロケーターでBoostコンテナーを使用した場合、コンテナーの割り当て元のプールが空になる可能性に突然対処する必要があるため、「起動時に割り当て」ルールの目的がなくなります。

メモリデバイスが限られている状況では、静的に割り当てられた配列よりも複雑なあらゆる種類のコンテナを避けます。

Boostはライブラリのセットです。それらのいくつかは、テンプレートのメタプログラミングに焦点を当てています。これらは実行時にメモリを使用しません。しかし、あなたの質問は、コンテナの交換についてのようです。カスタムアロケーターを使用することを除いて、それが可能だとは思わないしかし、それでも、ブーストではなくプレーンなSTLコンテナを使用している可能性が高いです。 Boostは、TR1がまだ含まれていないコンパイラーに対して、TR1コンテナーのみを提供します。

Boostを使用しないでください。

これは大きなライブラリであり、基本的なメモリ割り当て要件はライブラリ設計者の要件とは大きく異なります。

カスタムアロケーターを使用して、現在のバージョンのBoostを要件に応じて機能させることができる場合でも、Boostの新しいバージョンでは機能しなくなる可能性があります。

いくつかの便利なアイデアについては、Boostソースコードを自由に見てください。ただし、必要なものには独自の実装を使用してください。

今これを調べています—循環バッファ、ロックフリーコンテナ、および非同期I / Oを使用したいのですが、動的メモリを割り当てる代わりに、メモリプールを使用したいと思います。

これまで見てきた最大の問題は、 shared_ptr は多くの場所で使用されていますが、 intrusive_ptr shared_ptr は動的メモリを割り当てて参照カウントを追跡するため、組み込みシステムでは使用できません。

これを修正することは実行可能ですが、多くの作業が必要です—必要に応じて、特定のタイプの共有ポインターを intrusive_ptr に変更できるように、 shared_ptr を含むクラスのテンプレート仕様を拡張する必要があります。したがって、必要なBoost機能の独自バージョンを作成するのにどれだけの作業が必要になるかを比較する必要があります。快適な場所ではありません。

なぜ私がこれについて間違っているのか、誰かが指摘してくれることを願っています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top