【发布时间】:2014-09-24 15:42:23
【问题描述】:
如果您将 C++ std::map(和其他容器)与值类型一起使用,您会注意到插入映射会调用元素类型的析构函数。这是因为 C++ 规范要求运算符 [] 的实现等价于:
(*((std::map<>::insert(std::make_pair(x, T()))).first)).second
它会调用您类型的默认构造函数来构建该对。然后将该临时值复制到映射中,然后销毁。可以在this stackoverflow post 和here on codeguru 中找到对此的确认。
我觉得奇怪的是,这可以在不需要临时变量的情况下实现,并且仍然是等效的。 C++ 有一个特性叫做"inplace new"。 std::map 和其他容器可以为对象分配空间,然后在分配的空间上显式调用元素的默认构造函数。
我的问题:为什么我见过的 std::map 的实现都没有使用 inplace new 来优化这个操作?在我看来,这将大大提高这种低级操作的性能。但是很多人都研究过STL代码库,所以我认为这样做一定有一些原因。
【问题讨论】:
-
测试用例包含在链接的 stackoverflow 帖子中。这是链接:stackoverflow.com/questions/4017892/…
-
Mike Seymour:所以你的意思是关闭调试器后,这些对析构函数的额外调用就会消失?你知道那是真的吗?即使这是真的,这确实意味着在调试的情况下,执行更难调试(我不能只在调试器中设置断点来寻找“真正的”范围问题)。调试时它的性能也较低,这是一个较小的问题,但仍然是真实的。在我看来,这两个原因都是使用 inplace new 而不是这样一个低级库的原因。
标签: c++ stl new-operator