2

MemRefメモリへのポインタと長さを含む小さなオブジェクトです。クリティカル セクションでの文字列のコピーを最小限に抑えることは、最適化プロジェクトの中心です。トークンはdeque<MemRef>.

MemRef入力バッファーでトークンを識別したら、 s を作成してトークン両端キューに追加したいと考えています。最初の試みは:

MemRef foo(token_begin, token_len);
tokens.push_back( foo );

ここで dtor 呼び出しを見たので、fooが作成され、コピーされ、その後破棄されていることがわかりました。次の試みは:

tokens.push_back( MemRef(token_begin, token_len) );

しかし、私は同じ行動を見ました。私の推測では、テンポラリーが作成され、deque にコピーされてから破棄され、おそらくこれが「移動セマンティクス」の対象になるところです (これについてはよくわかりません)。

MemRef実際、一時的なものを作成および破棄せずに、トークンの両端キューに直接構築する方法はありますか?

(私は --std=c++11 で Apple LLVM バージョン 5.0 (clang-500.2.79) を使用しています)

4

1 に答える 1

5

使用emplace_back:

tokens.emplace_back(token_begin, token_len);

MemRefこれにより、インプレースが構築されます。これは c++11 でのみ使用できることに注意してください。

于 2013-12-03T05:02:49.810 に答える