1

Visual C++ 新手在这里。(我在很久以前就开始使用 Visual C++ 6,从那时起偶尔使用 IDE,但仍然觉得不舒服。给我一个好的旧命令行并离开我的草坪,这就是我的态度。)

我正在帮助一个使用 Visual C++ 2010 构建的应用程序(它是一个包含 20 个子项目的解决方案文件),并注意到一些奇怪的事情:即使 _ITERATOR_DEBUG_LEVEL 和 _SECURE_SCL 在项目的属性中都定义为零,为其中一个添加 /FAs .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,这对于发布的产品来说似乎很奇怪。msvcp100应该怎么做? .dll 的 _Orphan_all@_Container_base0@std@@QAEXXZ 可以做——它是无操作的,还是它实际上做的事情,比如 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

很可能该函数是通过 SFINAE 选择的(而不是库中的#ifdef -ed),在这种情况下可能有一个空_Orphan_all函数。如果您在调试模式下编译,该功能仍然存在,一旦您启动优化器,它应该能够删除调用。

请注意,我没有 Windows 框来检查 Visual Studio 中标准库的实现是什么样的,所以这只是看着我的水晶球的随机猜测。

于 2012-07-20T04:24:20.137 回答