2008-09-18 15 views
7

다음과 같은 코드가 있다고 가정 해 보겠습니다.기본 생성 값을 반환하는 데 문제가 있습니까?

class some_class{}; 

some_class some_function() 
{ 
    return some_class(); 
} 

이것은 꽤 잘 작동하는 것처럼 보이고 반환 값을 만들기 위해 변수를 선언해야하는 번거 로움을 덜어줍니다. 그러나 저는 어떤 종류의 튜토리얼이나 레퍼런스에서 이것을 본 적이 없다고 생각합니다. 이것은 컴파일러에 특정한 것 (Visual C++)입니까? 아니면 뭔가 잘못하고있는 것입니까?

답변

16

아니요. 이것은 완벽하게 유효합니다. 이것은 컴파일러가 실제로 임시를 최적화 할 수 있기 때문에 더 효율적입니다.

+0

실제로 현대 컴파일러는 반환 된 이름이 지정된 변수를 opimize 할 수 있습니다. –

1

이것은 매우 합리적인 C++입니다.

1

이것은 완전히 합법적 인 C++이며 모든 컴파일러가 받아 들여야합니다. 왜 뭔가 잘못하고 있다고 생각하니?

+0

C++을 사용하여 제한된 경험으로 어디서나 사용 된 적이 실제로 없었습니다. –

+0

충분합니다. 만약 임시 변수를 사용할 이유가 없다면 확실히 사용하십시오! –

5

함수 호출에서 객체를 반환하는 것은 "공장"디자인 패턴이며 광범위하게 사용됩니다.

그러나 개체 또는 개체에 대한 포인터를 반환할지 여부는 신중해야합니다. 앞에서는 생성자/대입 연산자를 복사하는 방법을 소개합니다. 이는 어려울 수 있습니다.

2

유효하지만 성능은 호출 방법에 따라 이상적이지 않을 수 있습니다. 예를 들어

:

A a; 
a = fn(); 

A a = fn(); 

은 동일하지 않다.

첫 번째 경우 기본 생성자가 호출 된 다음 임시 변수를 생성해야하는 할당 연산자가 호출됩니다.

두 번째 경우에는 복사 생성자가 사용됩니다.

지능형 컴파일러는 최적화가 가능한지 알아낼 것입니다. 그러나 복사 생성자가 사용자가 제공하는 경우 컴파일러가 임시 변수를 최적화하는 방법을 알지 못합니다. 그것은 복사 생성자를 호출해야하고, 다른 인스턴스를 가져야합니다.

+1

표준을 사용하면 컴파일러에서 명시 적으로 복사 생성자를 삭제할 수 있습니다. –

1

클래스가 꽤 가벼운 경우 가장 좋은 방법입니다. 사본을 만드는 데 비용이 많이 들지는 않습니다.

비록 그 방법의 한 가지 부작용은 컴파일러가 물건을 얼마나 잘 최적화 할 수 있느냐에 달려 있지만 임시 객체를 생성하는 경향이 있다는 것입니다.

더 많은 중량 클래스를 복사하려면 (예 : 큰 비트 맵 이미지) 복사하지 않으려면 해당 매개 변수를 참조 매개 변수로 전달하면 좋은 정보를 얻을 수 있습니다. 임시 객체가 생성되지 않도록 절대적으로 확인하십시오.

구문을 단순화하고 직접 작성하면 식에 더 많은 임시 개체를 만들 수있는 부작용이 생길 수 있습니다. 중량이 많은 개체의 인터페이스를 디자인 할 때 염두에 두어야 할 것이 있습니다.

2

Google에서 원할 경우 Rob Walker의 예를 RVO (Return Value Optimization)라고합니다.

덧붙여 말하자면, 객체가 가장 효율적인 방식으로 반환되도록하려면, shared_ptr을 사용하여 힙에 객체를 작성하십시오 (예 : new를 통해). 대신 shared_ptr을 반환하십시오. 포인터가 반환되고 참조 횟수가 올바르게 계산됩니다.

+1

일반적으로 RVO는 shared_ptr을 사용하는 것보다 효율적이며 개체가 힙에서 제자리에 만들어집니다. 또한 shared_ptr은 개수를 저장하는 추가 객체를 생성해야합니다. –