如果您使用C++的std::map(以及其他容器)与值类型,您会注意到插入到映射中会调用您元素类型的析构函数。这是因为运算符[]的实现根据C++规范要求等同于以下内容:
它调用您类型的默认构造函数以构建该对。然后将该临时值复制到映射中,然后进行销毁。可以在此stackoverflow帖子和这里在codeguru上中找到确认。我发现奇怪的是,这可以在不需要临时变量的情况下实现,并且仍然等效。C++有一个名为"inplace new"的功能。std::map和其他容器可以为对象分配空白空间,然后在分配的空间上显式调用元素的默认构造函数。 我的问题:为什么我看到的所有std::map的实现都没有使用原地new来优化这个操作?在我看来,这将显着提高此低级操作的性能。但是许多人已经研究了STL代码库,所以我认为必须有某些原因才会这样做。
(*((std::map<>::insert(std::make_pair(x, T()))).first)).second
它调用您类型的默认构造函数以构建该对。然后将该临时值复制到映射中,然后进行销毁。可以在此stackoverflow帖子和这里在codeguru上中找到确认。我发现奇怪的是,这可以在不需要临时变量的情况下实现,并且仍然等效。C++有一个名为"inplace new"的功能。std::map和其他容器可以为对象分配空白空间,然后在分配的空间上显式调用元素的默认构造函数。 我的问题:为什么我看到的所有std::map的实现都没有使用原地new来优化这个操作?在我看来,这将显着提高此低级操作的性能。但是许多人已经研究了STL代码库,所以我认为必须有某些原因才会这样做。