【问题标题】:Vector specialization for scalar types gone in Visual C++ 2015?Visual C++ 2015 中的标量类型的向量特化?
【发布时间】:2016-04-12 12:48:41
【问题描述】:

在将我们的项目升级到 Visual Studio 2015 时,我们遇到了一个问题,即销毁大的 vector<unsigned char>,它正在存储一个图像 - 大约 5 Mb。在 Debug 构建中大约需要 0.5 秒,而对于 char(POD 类型),原则上应该只调用一次内存释放调用。

调试器显示 VS 2015 (VC 14.0) 中的实现会遍历被破坏数组中的每个元素并调用其析构函数 - 无论它是 POD 类型还是复杂类型。所以我理解了这个问题以及为什么它只出现在 Debug 版本中 - 在 Release 版本中,编译器足够聪明,可以删除不必要的空函数调用。

实际上,在 Visual Studio 的所有早期版本(检查 2003 和 2012)中都有标量类型的专门化:

template<class _Alloc> inline
void _Destroy_range(typename _Alloc::pointer _First,
    typename _Alloc::pointer _Last, _Alloc& _Al,
    _Scalar_ptr_iterator_tag)
{   // destroy [_First, _Last), scalar type (do nothing)
}

但现在它已经消失了,我们所拥有的只是

template<class _Alloc> inline
void _Destroy_range(typename _Alloc::pointer _First,
    typename _Alloc::pointer _Last, _Alloc& _Al)
{   // destroy [_First, _Last)
for (; _First != _Last; ++_First)
    _Al.destroy(_STD addressof(*_First));
}

我只是不明白为什么删除了这个有用且简单的优化。而且我找不到任何来自 Microsoft 的 cmets。

问题

  • 有人知道这种变化的原因吗?
  • 有没有办法在不更改代码中每个 POD 向量的情况下解决缓慢的销毁问题(更改为自定义容器或unique_ptr&lt;type[]&gt; / boost::scoped_array)?

【问题讨论】:

    标签: vector visual-studio-2015 msvcrt


    【解决方案1】:

    您的理论似乎是正确的,他们最近删除了专业化,它看起来像一个错误。团队中的一位开发人员表示,之所以做出更改,是因为有些构造函数没有被调用,而应该被调用。这个新版本在技术上可能更正确,但对调试有可怕的性能影响。

    https://connect.microsoft.com/VisualStudio/feedback/details/2661660/missing-vector-specialization-for-scalar-types

    我也遇到了这个问题。这是我的测试程序:

    int main()
    {
        auto foo = new std::vector<unsigned char>(100 * 1000 * 1000);
        delete foo;
        return 0;
    }
    

    这在 VS 2015 w/toolset=vc120 中运行时间约为 54ms,而在 w/toolset=vc140 中运行时间约为 11,000ms。所有时间都花在删除行上。

    我还没有找到解决方法。

    【讨论】:

    • 太好了,感谢您的发现!我希望他们确实在下一次更新中解决了这个问题。出于我的需要(为 C 交互创建缓冲区),我转而使用 unique_ptr&lt;type[]&gt;,并且可以很好地完成这项简单的工作。
    • 看起来在 VS 2015 更新 3 中已修复。来自发行说明:我们在销毁更新 2 中回归的琐碎对象范围时恢复了调试模式性能,例如向量。
    • 我刚刚确认它确实已在更新 3 中修复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-26
    • 2015-02-17
    相关资源
    最近更新 更多