2012-03-13 6 views
0

가능한 중복에 대한 혼란 스러워요 : 다음 코드에서
Why copy constructor is not called in this case?내가 C에서 복사 생성자 ++

, 나는 세 개의 변수, A1, A2 및 A3 건설했다. C++ 프라이머 p.476의 예를 거기

는 :

string empty_copy = string();//copy-initialization 

사람이 나를 설명 할 수 있습니까

1) 왜 A1과 A2는 복사 생성자에 의해 구성되지 않고

2) 내 코드에서 초기화 a2와 책에서 empty_copy의 차이점은 무엇입니까?

감사합니다.

#include<iostream> 
using namespace std; 
class A{ 
public: 
    A(){} 
    A(int v){} 
    A(const A&x){ 
     cout<<"copy constructor"<<endl; 
    } 
}; 
A generateA(){ 
    return A(0); 
} 
int main(){ 
     cout<<"First:"<<endl; 
     A a1=generateA(); 

     cout<<"Second:"<<endl; 
     A a2=A(0); 

     cout<<"Third:"<<endl; 
     A a3=a1; 
    return 0; 
} 

은 (비주얼 Win7에 스튜디오 2010 Ubuntu10.10에서 g ++ 아래) 넣어입니다 :

First: 
Second: 
Third: 
copy constructor 

답변

6

이에 Return value optimization 인해 복사 생략합니다.
컴파일러는 이러한 최적화를 적용하여 복사본 생성을 최적화 할 수 있습니다.

A a1=generateA(); 
A a2=A(0); 

위의 두 경우 모두에서 컴파일러는 반환 값을 보관하기 위해 생성 된 임시 개체 생성을 제거 할 수 있습니다.

A a3=a1; 

이 컴파일러는해야하고 최적화 할 수있는 복사 생성자 호출을 포함 a3의 건설에 사용되는 이미 이름이 기존의 객체 a1을 포함한다.

편집 : 코멘트에서 질문에 대답합니다.

당신은 컴파일시 다음과 같은 옵션을 사용하여이 최적화를 적용하지 컴파일러를 알 수 있습니다 :

를 들어 GCC :

-fno-elide-constructors 

를 들어 MVSC :

/Od 
+0

그리고 * 또한 임시로 초기화 때문에 elion을 복사하십시오. 그래서 두 종류의 용출액이 사용되었습니다. –

+0

감사! BTW, 최적화를 비활성화하는 방법이 있습니까? –

+0

@ user1265982 : 예. 자세한 내용은 업데이트 된 답변을 확인하십시오. –

1
  1. 복사 생성자 때문에 두 경우 모두 당신이 int를 전달하고, 따라서 컴파일러는 당신이 정의한 A(int) 생성자를 사용에 a1a2을 위해 사용되지 않습니다.

  2. 당신과 책에서 예제의 차이는,이 책은 스택 (string())에 인스턴스를 생성, 따라서 귀하의 경우, 당신이 존재하는 을 사용하는 동안, 빈 복사를지고 있다는 점이다 인스턴스 (a1). 둘 다 초기화를 위해 복사 생성자를 사용합니다.

1

a1을 초기화 할 때 정수 인수 (공장 기능에서 제공)가 있습니다. a2의 경우 정수도 전달합니다. a3에 대해 a3 = a1이라고 말하면됩니다. 이것은 복사 생성자가 정의되어 있으므로 a3 (a1)로 해석되므로 호출됩니다.