パフォーマンスが重要なコードで 'deque' を使用したことがある人なら誰でも、(少なくとも VS2010 に同梱されている STL では) ブロック サイズが 16 バイトであることに気付いているでしょう。これは、VS2010 に同梱されているヘッダー ファイルの実際の抜粋です。
#define _DEQUESIZ (sizeof (value_type) <= 1 ? 16 \
: sizeof (value_type) <= 2 ? 8 \
: sizeof (value_type) <= 4 ? 4 \
: sizeof (value_type) <= 8 ? 2 \
: 1) /* elements per block (a power of 2) */
これは新しい情報ではありません。この宣言がパフォーマンスの問題を引き起こす理由の詳細については、deque<T> の追加の間接化についてを参照してください。
さまざまなアルゴリズムで両端キューを使用したいのですが、この実装に制約されている場合はそうではありません。この問題を回避する最善の方法は何ですか?
1) この問題のない別の容器を使用してください。もしそうなら、誰かが GNU ライセンス制限のないものを教えてもらえますか?
2) この制限に対処する新しいコンテナ クラスを作成します。この新しいコンテナ クラスは std 名前空間の一部ではありません。
3) 「deque」ヘッダー ファイルの _DEQUESIZ 定義を編集します。STLで定義されているように、_DEQUESIZの正確な仕様は両端キューの概念の一部ではないため、IMOはこれは合法だと思います。
4) 追加のテンプレート パラメータを deque (および関連するイテレータ クラス) に追加して、コンパイル時にブロック サイズを指定できるようにします。このパラメーターは、デフォルトで _DEQUESIZ の現在の定義になります。このろくでなしの STL を使用する私のコードは移植性がないため、私はこのソリューションをほとんど拒否しています。
5) STL を変更するよう議会に働きかけ、パフォーマンスの問題なしに「deque」を喜んで使用できるようにします。IMO、これは現在の財政の崖の議論よりも成功する可能性があります。ところで、私はカナダ人なので、下院全体 + 上院 + 大統領のリグマロールは混乱を招きます。