我正在为 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 );
}
此测试仅创建一个包含 3 个元素的向量。我期望 3 个默认构造函数调用和 0 个副本,因为没有A
左值。
在 Visual C++ 2010 中,输出为:
default
move
default
move
default
move
在 GCC 4.4.0 (MinGW) 中,(-O2 -std=c++0x),输出为:
default
copy
copy
copy
发生了什么事,我该如何解决?实际课程的副本很昂贵,默认构造和移动很便宜。