我正在尝试在我的容器库中实现以下优化:
- 插入左值引用元素时,将其复制到内部存储;
- 但是在插入右值引用元素时,如果支持,请移动它。
优化应该是有用的,例如,如果包含的元素类型是类似std::vector
的,如果可能的话移动会大大加快速度。
但是,到目前为止,我无法为此设计任何工作方案。我的容器相当复杂,所以我不能insert()
多次重复代码:它很大。我想将所有“真实”代码保留在某个内部助手中,比如说do_insert()
(可能是模板化的),并且各种insert()
类似的函数只会用不同的参数调用它。
我最好的赌注代码(原型,当然,没有做任何真实的事情):
#include <iostream>
#include <utility>
struct element
{
element () { };
element (element&&) { std::cerr << "moving\n"; }
};
struct container
{
void insert (const element& value)
{ do_insert (value); }
void insert (element&& value)
{ do_insert (std::move (value)); }
private:
template <typename Arg>
void do_insert (Arg arg)
{ element x (arg); }
};
int
main ()
{
{
// Shouldn't move.
container c;
element x;
c.insert (x);
}
{
// Should move.
container c;
c.insert (element ());
}
}
但是,这至少不适用于 GCC 4.4 和 4.5:它永远不会在 stderr 上打印“移动”。或者是我想要的不可能实现,这就是为什么emplace()
首先存在类似功能的原因?