我对push_back和emplace_back之间的区别有点困惑
无效安放背面(类型&;&;&;Val);
无效推回(常量类型和值);
无效推回(类型和值);
由于有一个push_back重载获取一个右值引用,我不太明白emplace_back的目的是什么
除了访客所说的以外:
MSCV10提供的功能void emplace_-back(Type&;&;&u-Val)是不一致的和冗余的,因为正如您所指出的,它严格等同于push_-back(Type&;&;&u-Val)
但是emplace\u back的真正C++0x形式非常有用:void emplace\u back(Args&;…)
它不采用value\u type,而是采用可变参数列表,这意味着您现在可以完美地转发参数并直接将对象构造到容器中,而无需临时变量
这是很有用的,因为无论RVO和move semantic给表带来了多大的聪明,仍然存在一些复杂的情况,即push_back可能会产生不必要的拷贝(或移动)。例如,使用std::map的传统insert()函数,您必须创建一个临时文件,然后将其复制到std::pair<;关键、价值>,然后将其复制到地图中:
std::map<;int,复杂>;M
int-anInt=4;
双倍=5.0;
std::string aString=“C++”;
//交叉手指,这样优化器就真的很好了
m、 插入件(标准:制作成对件(4件,复杂件(一件、一件、两件、一件));
//对优化器来说应该更容易
m、 侵位(4个,一个,一个,两个);
那么为什么他们没有在MSVC中实现正确版本的emplace_呢?事实上,它也在不久前给我挂上了,所以我在VisualC++博客上问了同样的问题。下面是微软Visual C++标准库实现的官方维护者Stephan T Lavavej的解答。
问:beta 2安放功能现在只是某种占位符吗
你可能知道,可变模板
没有在VC10中实现。我们
用预处理器模拟它们
像这样的机器
make_shared<;T>;()、元组和新
中的内容<;功能性>。这
预处理器的机械相对简单
难以使用和维护。而且
它对编译有很大影响
速度,就像我们不得不重复的那样
包括分目。由于
结合我们的时间限制
考虑到编译速度的问题,我们
没有模拟可变模板
在我们的阵地上当可变模板
在编译器中实现,您可以
预计我们将利用
他们在图书馆里,包括
我们的阵地功能。我们采取
我很认真,但是
不幸的是,我们不能做每件事
一下子
这是一个可以理解的决定。每一个只尝试过一次用预处理器可怕的技巧来模拟可变模板的人都知道这东西有多恶心