2016-07-05 20 views
0

私は現在、カスタムIRを使用するコンパクトなコンパイラを(Design-Stageで)開発中です。私が抱えている問題は、すべての命令を含む効率的なコンテナデータ構造を選択することです。std :: vectorとstd :: listに似たコンテナデータ構造

基本ブロックには〜10000命令が含まれ、命令は〜250バイトほど大きくなります。

コンパイラには複雑な変換(つまり多数のランダム挿入/削除)があるため、イテレータを無効にしないコンテナデータ構造を持つとリストが使えると思っていました。それは、変換アルゴリズムを単純で容易に続けることができるためです。

一方、キャッシュミスとメモリ断片化に関する既知の問題のため、パフォーマンスが低下します。 std :: vectorはここで役立ちますが、ベクトルを使って変換を実装するのは苦痛になると思います。

メモリのキャッシュミスを減らすためにメモリの断片化が少なく、イテレータを無効にしない別のデータ構造がある場合、質問があります。 これを無視して、リストを使用し続ける必要がある場合。

+0

イテレータの無効化に関する問題を回避することをお勧めします – SirGuy

答えて

0

using Container = std::vector<Instruction>で始まります。 std::vectorはかなり良いデフォルトコンテナです。パフォーマンスが問題になると、プログラムは2つの異なるコンテナでプロファイルされます。 Containerを他のコードであまり変更する必要なく交換することができます。何らかの配列リストが一番良いと思いますが、おそらくチェックしてください。

+0

これは、要素をランダムに挿入および削除するときに可能であるかどうかはわかりませんが、イテレータは無効になります。すべての変換(アルゴリズムも)を書き直さなければならない、これはうまくいかない。 – lled

+1

@lled安定したイテレータ*と*ランダムな挿入と削除が必要な場合、メモリ断片化リンクリスト以外の方法はありません。ベクタに対してイテレータの代わりにインデックスを使用できるかどうかを確認してください。 – nwp

関連する問題