调用vector.push_back()时避免使用copy-constructor /析构函数

Cha*_*hap 2 c++ copy-constructor temporary-objects move-semantics

MemRef是一个小对象,包含指向内存的指针和长度.它是优化项目的核心,可以最大限度地减少关键部分中的字符串复制.令牌是一个deque<MemRef>.

当我在输入缓冲区中识别标记时,我想构造MemRefs并将它们添加到令牌deque中.首先尝试的是:

MemRef foo(token_begin, token_len);
tokens.push_back( foo );
Run Code Online (Sandbox Code Playgroud)

自从我在这里看到dtor调用以来,它让我觉得foo正在创建,复制,然后被破坏.接下来的尝试是:

tokens.push_back( MemRef(token_begin, token_len) );
Run Code Online (Sandbox Code Playgroud)

但我看到了同样的行为.我的猜测是,正在创建一个临时文件,复制到双端队列中,然后销毁,这也许就是"移动语义"主题的来源(我很不清楚).

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

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

小智 5

用途emplace_back:

tokens.emplace_back(token_begin, token_len);
Run Code Online (Sandbox Code Playgroud)

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