我正在为linux和windows编写一个应用程序,并注意到GCC构建产生了许多对复制构造函数的无用调用.
以下是产生此行为的示例代码:
struct A
{
A() { std::cout << "default" << std::endl; }
A(A&& rvalue) { std::cout << "move" << std::endl; }
A(const A& lvalue) { std::cout << "copy" << std::endl; }
A& operator =(A a) { std::cout << "assign" << std::endl; return *this; }
};
BOOST_AUTO_TEST_CASE(test_copy_semantics)
{
std::vector<A> vec_a( 3 );
}
Run Code Online (Sandbox Code Playgroud)
此测试仅创建3个元素的向量.我期望3个默认构造函数调用和0个副本,因为没有A左值.
在Visual C++ 2010中,输出为:
default
move
default
move
default
move
Run Code Online (Sandbox Code Playgroud)
在GCC 4.4.0(MinGW)中,( - 02 -std = c ++ 0x),输出为:
default
copy
copy
copy
Run Code Online (Sandbox Code Playgroud)
发生了什么,我该如何解决?副本对于实际类来说是昂贵的,默认构造和移动都很便宜.
我有一个类字段,它是一个std :: vector.我知道我希望这个向量包含多少个元素:N.如何用N个元素初始化向量?