C++ 调用vector.push_back()时避免复制构造函数/析构函数
C++ 调用vector.push_back()时避免复制构造函数/析构函数,c++,copy-constructor,move-semantics,temporary-objects,C++,Copy Constructor,Move Semantics,Temporary Objects,MemRef是一个小对象,包含指向内存的指针和长度。优化项目的核心是最小化关键部分中的字符串复制。代币是一种deque 当我在输入缓冲区中标识令牌时,我想构造MemRefs并将它们添加到令牌deque中。第一次尝试是: MemRef foo(token_begin, token_len); tokens.push_back( foo ); tokens.push_back( MemRef(token_begin, token_len) ); 自从我在这里看到dtor调用,我就知道foo正在被
MemRef
是一个小对象,包含指向内存的指针和长度。优化项目的核心是最小化关键部分中的字符串复制。代币是一种deque
当我在输入缓冲区中标识令牌时,我想构造MemRef
s并将它们添加到令牌deque中。第一次尝试是:
MemRef foo(token_begin, token_len);
tokens.push_back( foo );
tokens.push_back( MemRef(token_begin, token_len) );
自从我在这里看到dtor调用,我就知道foo正在被创建、复制,然后被销毁。下一次尝试是:
MemRef foo(token_begin, token_len);
tokens.push_back( foo );
tokens.push_back( MemRef(token_begin, token_len) );
但我看到了同样的行为。我的猜测是,一个临时文件正在被创建,复制到deque中,然后被销毁,也许这就是“移动语义”的主题出现的地方(我对此非常不清楚)
实际上,有没有一种方法可以直接将MemRef
构造到令牌deque中,而不创建和销毁临时的
(我正在使用Apple LLVM 5.0版(clang-500.2.79)和--std=c++11)使用:
这将在适当位置构建一个
MemRef
。请注意,这仅适用于c++11。是!尽管我还不知道我的编译器是否完全兼容c++11,但它对我来说是有效的。无论如何,我想它已经足够接近了。我相信clang-500.2.79基本上符合c++11。您可能需要使用-stdlib=libc++
进行编译,此外还需要使用-stdlib=libc++进行编译。我看不出有什么不同;仍然有效。