c++ - 调用 vector.push_back() 时避免复制构造函数/析构函数

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

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

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

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

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

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

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

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

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

最佳答案

使用emplace_back :

tokens.emplace_back(token_begin, token_len);

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

关于c++ - 调用 vector.push_back() 时避免复制构造函数/析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20343234/

相关文章:

c++ - 利用 C++ 中的 move 语义

c++ - 我可以列出初始化只 move 类型的 vector 吗?

c++ - C++中线程安全的生产者/消费者模式

c++ - 如何在复制构造函数中调用重载的下标?

c++ - 如何在测量性能时减少循环开销?

c++ - 为什么我们不能在 C++ 的复制构造函数中使用指针传递?

C++:关于对象的一个​​小问题

c++ - 将 C++11 move 语义应用于绑定(bind)函数

c++ - 如何在不阻塞输入的情况下使用 getline?

c++ - 在执行 boost::asio::async_read 之后操作 streambuf 是否安全?