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

时间:2013-12-03 05:00:49

标签: c++ copy-constructor move-semantics temporary-objects

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

当我在输入缓冲区中识别标记时,我想构造MemRef并将它们添加到令牌双端队列中。首先尝试的是:

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)

1 个答案:

答案 0 :(得分:5)

使用emplace_back

tokens.emplace_back(token_begin, token_len);

这将在原地构建MemRef。请注意,这仅适用于c ++ 11。