コンテナー ライブラリで次の最適化を達成しようとしています。
- 左辺値参照要素を挿入するときは、それを内部ストレージにコピーします。
- ただし、右辺値参照要素を挿入するときは、サポートされている場合は移動します。
最適化は、たとえば、含まれる要素の型が のような場合に役立つはずです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 に「moving」と表示されることはありません。それとも、私が達成したいことは不可能であり、それがemplace()
そもそものような機能が存在する理由ですか?