2011-06-21 12 views
8

STLコンテナを大量に使用する非常に複雑なアプリケーションを作成しています。このアプリケーションには、比較的単純でパフォーマンスの高い単一のセクションがあり、std::mapを複数回反復し、何千回も実行されます。テストでは、チェックされたイテレータを無効にしてコンパイルする(_SECURE_SCLが0に設定されている)と、このセクションに完全に集中してプログラム全体がほぼ2倍高速化されています。 を有効にしてコンパイルしたライブラリにリンクする必要があり、_SECURE_SCLの設定を混在させる必要があるため、アプリケーションを_SECURE_SCLに設定するとアプリケーションをコンパイルできません。また、すべてのパフォーマンスに影響されやすいビットが一画面のコードで発生する場合、アプリケーション全体でチェックされていないイテレータを使用することはむしろ愚かであることがわかります。それは、お風呂の水で赤ちゃんを捨てることと同じです。チェックイテレータを選択的に無効にする

チェックインされたイテレータでコンパイルされたライブラリとの互換性を維持しながら、パフォーマンスに影響を受けやすいコード/コンテナに対して、未チェックのイテレータを選択的に使用するためには、どのようなオプションが必要ですか?

+0

感謝を! – drxzcl

+0

喜んで助けてください。良い質問が良く見えるはずです! –

答えて

4

これが私の作品:フォーマットヘルプの

vector<BYTE> v; 
vector<BYTE>::iterator i; 
vector<BYTE>::iterator::_Unchecked_type ui; 

i = v.end(); 
ui = i._Unchecked(); 

ui++; 
+0

それは素晴らしい作品です、あなたは私のヒーローです!これらのことに関する情報を見つけることがどれほど難しいかは驚くべきことです。 – drxzcl

+0

このソリューションはVC9/VS2008ではサポートされていないようですが、これは正しいですか? – drxzcl

+1

はい、コードはVS2010で行われました。 – nnn

6

すでにわかっているように、チェックされた/チェックされていないイテレータを使用するコードを混在させることはできません。そのため、コードの一部で使用するには、コンテナとイテレータ。 (これはstd::stringに拡張されています)
もちろん、そのコードを独自の実行可能ファイル(DLL)に入れる必要があります。もちろん、これは、そのAPIの前後であまりにも多くのコールを前後にしないことを必要とします。

私は安全面であるために、その部分をCインターフェイスのDLLに入れることも検討しています。

+0

あなたの答えをありがとう。それは私が聞くことを望んでいたものではありませんが、理にかなっています。別のSTL実装のコンテナを使用するとどうなりますか? – drxzcl

+0

@Ranieri:同じ痛みはありえないでしょう。 – sbi

関連する問題