2

MemRef是一个包含指向内存的指针和长度的小对象。将关键部分中的字符串复制最小化是优化项目的核心。令牌是一个deque<MemRef>.

当我在输入缓冲区中识别标记时,我想构造MemRefs 并将它们添加到标记双端队列中。第一次尝试是:

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

因为我在这里看到了 dtor 调用,所以它告诉我foo正在被创建、复制,然后被销毁。下一次尝试是:

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

但我看到了同样的行为。我的猜测是正在创建一个临时对象,将其复制到双端队列中,然后将其销毁,这也许就是“移动语义”主题的来源(我对此非常不清楚)。

有没有办法,实际上,MemRef直接构建到令牌双端队列,而不创建和销毁临时?

(我使用 Apple LLVM 5.0 版(clang-500.2.79)和 --std=c++11)

4

1 回答 1

5

使用emplace_back

tokens.emplace_back(token_begin, token_len);

这将构建一个MemRef就地的。请注意,这仅适用于 c++11。

于 2013-12-03T05:02:49.810 回答