#include <iostream>
#include <string>
#include <vector>
using namespace std;
struct Exmpl{
Exmpl()
{
cout << "Exmpl()" << endl;
}
Exmpl(const Exmpl&)
{
cout << "Exmpl(const Exmpl&)" << endl;
}
Exmpl& operator=(const Exmpl& rhs)
{
cout << "operator=Exmpl()" << endl;
return *this;
}
~Exmpl()
{
cout << "~Exmpl()" << endl;
}
};
void func1(Exmpl obj)
{
}
void func2(Exmpl &obj)
{
}
Exmpl func3()
{
Exmpl obj;
return obj;
}
int main()
{
Exmpl eobj;
func1(eobj);
func2(eobj);
eobj = func3();
Exmpl *p = new Exmpl;
vector<Exmpl> evec(3);
delete p;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当用g ++(4.4.3)编译时,我得到了
Exmpl()
Exmpl(const Exmpl&)
~Exmpl()
Exmpl()
operator=(const Exmpl&)
~Exmpl()
Exmpl()
Exmpl()
Exmpl(const Exmpl&)
Exmpl(const Exmpl&)
Exmpl(const Exmpl&)
~Exmpl()
~Exmpl()
~Exmpl()
~Exmpl()
~Exmpl()
~Exmpl()
Run Code Online (Sandbox Code Playgroud)
在vs2008中,结果是:
Exmpl()
Exmpl(const Exmpl&)
~Exmpl()
Exmpl()
Exmpl(const Exmpl&)
~Exmpl()
operator=(const Exmpl&)
~Exmpl()
Exmpl()
Exmpl()
Exmpl(const Exmpl&)
Exmpl(const Exmpl&)
Exmpl(const Exmpl&)
~Exmpl()
~Exmpl()
~Exmpl()
~Exmpl()
~Exmpl()
~Exmpl()
Run Code Online (Sandbox Code Playgroud)
当代码转到"eobj = func3();"时 在main中,vs2008结果中的第5行和第6行在g ++中找不到.我尝试了几个级别的优化,但结果是一样的.差异的原因是什么?
当一个对象作为函数的值返回时(例如func3()),C++允许复制构造函数被省略.即使构造函数具有除构造新对象之外的副作用 - 在这种情况下,复制构造函数也会写入cout.
g++ 即使没有指定优化也会这样做,而MSVC只有在要求执行优化时才会这样做.
如果将程序减少到以下(只是将输出减少到有趣的部分):
int main()
{
Exmpl eobj;
eobj = func3();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
对于使用这些命令行生成的程序,您将看到以下内容(使用MinGW 4.6.1和MSVC 16.0进行的测试,也称为VC++ 2010):
g++ -O0 -o test.exe test.cpp (g ++,'不'优化)g++ -O2 -o test.exe test.cpp (g ++,优化)cl /Ox /EHsc test.cpp (msvc,optimziations)
Exmpl()
Exmpl()
operator=Exmpl()
~Exmpl()
~Exmpl()
Run Code Online (Sandbox Code Playgroud)cl /EHsc test.cpp (msvc,没有优化)
g++ -fno-elide-constructors -o test.exe test.cpp (没有构造函数的g ++按照Jesse Good的建议省略)
Exmpl()
Exmpl()
Exmpl(const Exmpl&)
~Exmpl()
operator=Exmpl()
~Exmpl()
~Exmpl()
Run Code Online (Sandbox Code Playgroud)