1

Visual C++ の初心者です。(私は Visual C++ 6 に少し前に精通し、それ以来散発的に IDE を使用してきましたが、まだ使い慣れていません。古き良きコマンドラインを与えて、芝生から降りてください。それが私の態度です。)

私は Visual C++ 2010 でビルドされたアプリ (20 のサブプロジェクトを含むソリューション ファイル) を手伝っていますが、奇妙なことに気付きました: プロジェクトのプロパティで _ITERATOR_DEBUG_LEVEL と _SECURE_SCL の両方がゼロに定義されていて、いずれかのプロパティに /FA が追加されているにもかかわらず、 .cpp ファイルは、チェックされたイテレータのものへの呼び出しを引き続き表示します。

   call    DWORD PTR __imp_?_Orphan_all@_Container_base0@std@@QAEXXZ

両方の定義がゼロであることを (printf で) 確認しました。さらに、これらの呼び出しは非常に壊れやすいようです。関連する関数から一見些細な量のコードを削除すると、Orphan_all の呼び出しが消えます。

では、ベクトルが _ITERATOR_DEBUG_LEVEL=0 で破棄されたときに、Visual C++ 2010 がまだ Orphan_all を呼び出しているのはなぜですか? (また、Windows sdk v7.1 の cl.exe 自体といくつかのゲームはすべて、msvcp100.dll から _Orphan_all@_Container_base0@std@@QAEXXZ をインポートしているように見えると聞いています。これは、リリースされた製品では奇妙に思えます。 .dll の _Orphan_all@_Container_base0@std@@QAEXXZ do -- これはノーオペレーションですか、それとも実際に msvcp100d.dll のようなことをしますか?)

4

2 に答える 2

1

編集。

したがって、_Vector_val は _Container_base から継承されているため、

#if _ITERATOR_DEBUG_LEVEL == 0
typedef _Container_base0 _Container_base;
typedef _Iterator_base0 _Iterator_base;

 #else /* _ITERATOR_DEBUG_LEVEL == 0 */
typedef _Container_base12 _Container_base;
typedef _Iterator_base12 _Iterator_base;
 #endif /* _ITERATOR_DEBUG_LEVEL == 0 */

ここで、_Container_base0 は

        // CLASSES _Container_base*, _Iterator_base*
struct _CRTIMP2_PURE _Container_base0
    {   // base of all containers
    void _Orphan_all()
        {   // orphan all iterators
        }

    void _Swap_all(_Container_base0&)
        {   // swap all iterators
        }
    };

_ITERATOR_DEBUG_LEVEL が 0 の場合、空の _Orphan_all を使用します。

于 2012-07-20T04:24:38.190 に答える
0

ほとんどの場合、関数は (ライブラリから#ifdef -edではなく) SFINAE を介して選択されます。この場合、空の_Orphan_all関数が存在する可能性があります。デバッグモードでコンパイルすると、関数はまだそこにあり、オプティマイザーを上げれば、呼び出しを削除できるはずです。

Visual Studio での標準ライブラリの実装がどのように見えるかを確認するための Windows ボックスがないことに注意してください。

于 2012-07-20T04:24:20.137 に答える