Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调用vector.push_back()时避免复制构造函数/析构函数_C++_Copy Constructor_Move Semantics_Temporary Objects - Fatal编程技术网

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++进行编译。我看不出有什么不同;仍然有效。