C代码在g和vs2008中得到不同的结果

#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;
}

当用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()

在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()

当代码转到“eobj = func3();”时在主要的,vs2008结果中的第5和第6行在g中找不到.我尝试了几个级别的优化,但结果是一样的.差异的原因是什么?

当一个对象作为一个函数的值返回时(如在func3()中),C允许复制构造函数被省略.即使构造函数具有除构造新对象之外的副作用 – 在这种情况下,复制构造函数也会写入cout.

即使没有指定优化,g也会这样做,而MSVC只有在要求执行优化时才会这样做.

如果将程序减少到以下(只是将输出减少到有趣的部分):

int main()
{
    Exmpl eobj;
    eobj = func3();

    return 0;
}

对于使用这些命令行生成的程序,您将看到以下内容(使用MinGW 4.6.1和MSVC 16.0进行的测试,也称为VC 2010):

> g -O0 -o test.exe test.cpp(g,’no’优化)
> g -O2 -o test.exe test.cpp(g,优化)
> cl / Ox / EHsc test.cpp(msvc,optimziations)

Exmpl()
Exmpl()
operator=Exmpl()
~Exmpl()
~Exmpl()

> cl / EHsc test.cpp(msvc,没有优化)
> g -fno-elide-constructors -o test.exe test.cpp(根据Jesse Good建议没有构造函数的g)

Exmpl()
Exmpl()
Exmpl(const Exmpl&)
~Exmpl()
operator=Exmpl()
~Exmpl()
~Exmpl()
相关文章
相关标签/搜索