2012-05-07 49 views
4
#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; 
} 

在克編譯時++(4.4.3)我有C++代碼獲取以g不同的結果++和VS2008

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 ++中找到。我嘗試了幾個優化級別,但結果是一樣的。差異的原因是什麼?

+3

嘗試使用g ++上的'-fno-elide-constructors'進行編譯。 –

回答

8

C++允許在函數返回一個對象作爲值時(如func3()),拷貝構造函數被刪除。即使構造函數具有除構造新對象之外的副作用 - 在這種情況下,複製構造函數將寫入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++ -O2 -o test.exe test.cpp(克++,優化)
  • 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良好的建議構造函數)

    Exmpl() 
    Exmpl() 
    Exmpl(const Exmpl&) 
    ~Exmpl() 
    operator=Exmpl() 
    ~Exmpl() 
    ~Exmpl()