2017-01-12 20 views
2

私はstd::vector<>のようなコンテナを使用したい組み込みアプリケーションで作業しています。残念ながら、私はヒープを使用してはいけません。だからstd::vector<>は使用できませんでした。だから私は代替案を探しています。ベクトル<>動的割り当ての代わりに静的メモリ

私はブーストstatic_vectorを見たことがありますが、ブーストのアプローチは、私が見た限り、マイクロコントローラにとっては重すぎるようです。または、小型のマイクロコントローラ(例えば、static_vectorのみ)上でブーストを使用した経験があるか?

アプリケーション実行時間全体のエントリの最大数はコンパイル時に分かります。

このためか、私はstd::array<>実装に基づいて、次の操作を可能にするために、いくつかのロジックを追加している自分でコンテナ実装する必要があれば、オープンソース・ソリューションがあればだから私は思ったんだけど:

追加が(push_back())、実行時に要素を削除します(erase())。典型的なコンテナイテレータとランダムアクセスを提供します。また、短い手のループも利用できるはずです。 push_back(イテレータを提供

  • 、ランダムアクセスが私には簡単に思える、とほとんどアドオンを追加するstd::array<>機能

  • に基づくべきである:

    だから私の単純なアプローチは次のようになります)と削除する(erase)いくつかのロジックに問題はないはずです。

  • しかし、ループの実装はどのように実装されていますか?

  • 他にも検討が必要なことはありますか?

+1

C++の場合、ヒープ対スタックより[ストレージの持続時間](http://stackoverflow.com/a/408691/1460794)について話すのが理にかなっています。 – wally

+0

静的な容量を持つブースト循環バッファが請求書に適合しているようです。 –

+0

@Muscampester原則として、あなたは完璧ですが、ここでは、割り当てが割り当てられているかどうかにかかわらず、ヒープが消されている(少なくとも私の会社では)埋め込み世界の何かの聖杯について話しています。 。 – Andreas

答えて

6

あなたは、インスタンスのために静的バッファからポインタを返すカスタムstd::allocatorstd::vectorを作成することができます。

コンテナ内のエントリの総数がコンパイル時にわかっているとしたら、std::arrayを使用するのはなぜですか?それとも古い形式の配列ですか?

範囲based for loop (for (:))用として、それは単にタイプに定義されるbeginendメンバーまたはフリー機能が必要なため、独自のタイプを作成しない場合は、これらを定義する必要があります。

+0

要素の数は、ソフトウェアが最終的に使用されるデバイスに基づいて動的であるということです。私が知っている唯一のことは、コンテナが最大限(いくつかの予備を加えて)保持する必要がある要素数です。 一方のデバイスに4つのセンサーがあり、もう一方のデバイスに7つのセンサーがあるとします。私は配列ではなくベクトルでそれらを管理したいと思います。私は旧式の配列やstd :: array <>でこれを行うことができますが、私はこのアプローチが嫌いです。 – Andreas

+2

@Andreasここでは、あなたが探しているものに近いカスタムアロケータの例を示します(これはもう少しですが、ニーズに合わせて単純化することも可能です)。https://howardhinnant.github.io/stack_alloc.html – Danra

関連する問題