【问题标题】:Selectively disabling checked iterators有选择地禁用检查的迭代器
【发布时间】:2011-06-21 09:30:52
【问题描述】:

我正在编写一个相当复杂的应用程序,它大量使用了 STL 容器。该应用程序有一个相对简单的性能敏感部分,它迭代多个std::maps 并执行数千次。测试表明,在禁用检查迭代器(_SECURE_SCL 设置为 0)的情况下编译会导致整个程序的速度几乎提高 2 倍,完全集中在本节中。

但是,我无法在 _SECURE_SCL 设置为 0 的情况下编译应用程序,因为需要链接在启用 _SECURE_SCL 的情况下编译的库,并且混合 _SECURE_SCL 设置会导致问题。此外,我发现在整个应用程序中使用未经检查的迭代器是相当愚蠢的,因为所有性能敏感位都发生在单个屏幕代码中。那无异于把婴儿和洗澡水一起扔出去。

在保持与使用检查迭代器编译的库的兼容性的同时,我必须有哪些选项来选择性地对性能敏感的代码/容器使用未检查的迭代器?

【问题讨论】:

  • 感谢格式化帮助!
  • 很高兴为您提供帮助。一个好问题应该看起来不错!

标签: c++ performance visual-studio-2008 stl iterator


【解决方案1】:

正如您已经发现的那样,您不能混合使用检查/未检查迭代器的代码,因此为了在您的部分代码中使用它,您需要为该部分提供一个不需要传递任何容器的接口和迭代器。 (请注意,这延伸到std::string。)
当然,您必须将该代码放入其自己的可执行文件 (DLL) 中。当然,这要求在该 API 上来回调用不要太多。

为了安全起见,我什至会考虑将该部分放入带有 C 接口的 DLL 中。

【讨论】:

  • 感谢您的回答。这不是我希望听到的,但这是有道理的。使用来自不同 STL 实现的容器怎么样?
【解决方案2】:

这对我有用:

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

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

ui++;

【讨论】:

  • 效果很好,你是我的英雄!很难找到有关这些东西的信息。
  • VC9/VS2008好像不支持这个方案,对吗?
  • 太好了,谢谢!我现在无法将整个构建系统升级到 VS2010,但至少我知道可以做到。
猜你喜欢
  • 2018-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-09
  • 1970-01-01
  • 2011-01-04
  • 1970-01-01
  • 2020-02-07
相关资源
最近更新 更多