거기에 아무것도 잘못으로 돌아온 기본 건설하는 가치입니까?
-
01-07-2019 - |
문제
가정하자 나는 다음과 같은 코드:
class some_class{};
some_class some_function()
{
return some_class();
}
이 작동하는 것 같다 꽤 잘하고 나를 저장 하는 데 문제 변수를 선언하게 반환 값.하지만 나는 생각하지 않는 본것이 어떤 종류에서의 튜토리얼을 참조.이 컴파일러 특유의 것(visual C++)?또는 이것이 뭔가 잘못입니까?
해결책
없이 완벽하게 유효합니다.이것은 또한 더 효율적으로 컴파일러가 실제로 할 수 있는 최리 일시적입니다.
다른 팁
로 돌아서 객체를 함수 호출은"공장은"디자인 패턴,광범위하게 사용됩.
그러나,당신이 원하는 것을 조심부 개체를 반환 또는 포인터를 객체입니다.전자는 이러한 당신을 소개할 것이 복사본을 생성자/할당 운영자가 될 수 있습니다.
그것은 유효하지만,성능은 이상하지 않을 수 있습 방법에 따라가 호출됩니다.
예를 들어:
A a;
a = fn();
고
A a = fn();
은 동일하지 않습니다.
첫 번째 경우에는 기본 생성자를 호출한 다음에 할당 운영자를 호출에 필요한 일시적 변수를 구성됩니다.
두 번째 경우에는 복사본을 생성자를 사용합니다.
지능형 충분한 컴파일러는 것입니다 무엇을 최적화가 가능합니다.지만,경우에는 복사본을 생성자는 사용자가 제공한 다음이 보이지 않는 어떻게 컴파일러 최적화할 수 있습으로 임시 변수가 있습니다.그것에는 호출하는 복사본을 생성자,그리고 그렇게 그는 다른 인스턴스입니다.
의 차이를 강탈 워커의 예이라는 반환 값을 최적화(RVO)하려는 경우 google 습니다.
덧붙여하려는 경우,enure 귀하의 개체 면에서 반환된 가장 효율적인 방식으로 만들기에 객체를 힙(ie 을 통해 새로운)을 이용하여 shared_ptr 및 반환 shared_ptr 대신 합니다.포인터를 반환되고 참조를 제대로입니다.
는 완벽한 합리적인 C++.
이것은 완벽하게 법적인 C++및 모든 컴파일러를 받아야 합니다.당신은 무엇을 생각을 하고 있을 수 있다고 뭔가 잘못입니까?
그것을 할 수있는 가장 좋은 방법은 당신의 클래스에 매우 가볍고-나는 의미 없다는 매우 비싼 복사본을 만들의습니다.
하나의 부작용하는 방법은 비록 그것을 만드는 경향이있다 더 가능성이 있는 일시체를 만들었지만,그에 따라 달라질 수 있습 방법론 컴파일러 최적화할 수 있습 것들입니다.
더 헤비급하는 클래스를 확인하고 싶지 않은 복사하고(예를 들어 큰 비트맵 이미지)다음 그것은 좋은 생각을 전달하는 주변에 참조로 매개 변수는 다음으로 채워에서,단지를 절대적으로 확인이 되지 않는 일시적인 개체를 만들어집니다.
전반적으로 일어날 수 있는 구문을 간소화하고 상황이 더 많은 직접 수 있다의 부작용을 만드는 이상의 임시 물체를 식에서,그는 무언가를 염두에 두어야 할 때는 디자인에 대한 인터페이스 더 헤비급 개체입니다.