2014-03-13 2 views
1

저는 C++의 전문가가 아니며 함수에서 값을 반환하는 가장 빠른 방법을 찾고 있습니다.값을 반환하는 가장 빠른 C++ 방법

void foo(const bar& parameter); 

는 반환 값과 같은 것을 할 수 있나요 : 예를 들어, 함수로 값을 전달하는 가장 빠른 방법은 const를 참조입니다 arguemnt? 나는 어쩌면 이런 일에, 참조를 반환하는 경우 :

bar& foo(); 

(함수 foo는이 종료 때문에) 변수가 더 이상 존재하지 않는 언급 이후 실행시에 어떤 문제가 없습니다. 조언 해 주셔서 감사 드리며 나쁜 영어로 죄송합니다.

+1

[유용한 기사 (http://cpp-next.com/archive/2009/08/want-speed-pass-by -value /) –

답변

4

나는 가장 깨끗한 방법은 RVO 복사 elision을 수행하는 컴파일러에 의존하는 것이라고 생각합니다. 이것은 최적화가 관찰 가능한 동작을 변경할 수있는 몇 가지 예외 중 하나이며, 현대적인 인기있는 컴파일러에서 널리 사용됩니다.

반환 후 개체가 존재해야하므로 참조를 반환하는 것이 적합하지 않을 수 있습니다. 이 클래스의 속성을 반환하는 메서드에 대한이 벌금. 그러나 객체가 함수를 사용하여 만들어지면 그렇게 쉽지 않습니다.

이외에도 물론 포인터를 반환 할 수 있습니다. 하지만 누군가가 객체를 릴리스해야하거나 어떤 종류의 스마트 포인터를 사용해야합니다.

std::move에 대해서는 "빠른 반환"을 원할 때마다 맹목적으로 사용하고 컴파일러를 신뢰하지 않는 것이 좋습니다. 참조 : When should std::move be used on a function return value?.

IMO를 반복하면 가장 좋은 방법은 (N) RVO를 허용하고 컴파일러를 신뢰하는 코드를 작성하는 것입니다.

+0

값을 반환 할 때 std :: move를 사용해야한다고 말하는 것은 아니지만 이동 의미를 사용하지 않는다는 의미는 아닙니다. 객체에 대한 이동 생성자를 정의하기 만하면 해당 위치가 사용되는 결과를 가져와야합니다 (최소 반환). – heinrichj

+0

@heinrichj 그래요, 입에 어떤 말도 넣지 않았습니다. 이동 의미를 명시 적으로 사용하는 것은 좋은 생각이 아니라는 점을 지적하고 싶었습니다. 처음에는 유혹을받을 수 있습니다. 또한 사본 추출은 어쨌든 이동보다 빠르다고 생각합니다. 생성자를 사용하지 않으려면 코드를 설계하는 것이 좋습니다. 그런 다음 이동할 수 없으면 마지막으로 리조트를 가장 느리게 복사합니다. BTW 정의 된 이동 생성자를 사용하여 값을 반환 할 때 RVO가 적용 가능하다면 = 중 하나를 사용한다는 의미는 아닙니다. – luk32

+0

그 마지막 추가를위한 감사합니다, 나는 그것을 생각하지 않았다 :) – heinrichj

1

정말로 문제가있을 것입니다. 반환되는 객체의 수명이 함수의 범위에 국한되지 않는 경우에만 수행 할 수 있습니다 (예 : 객체 멤버에 대한 참조를 반환 할 수 있음).

값으로 반환되는 작은 POD 객체의 경우 일반적으로 문제가되지 않습니다. 보다 복잡한 객체, 특히 동적 메모리 할당의 경우 C++ 11의 이동 의미를 사용하는 것이 가장 좋습니다. 막대가 이동 생성자를 정의하고 값으로 반환하면 함수에서 값을 기준으로 인스턴스를 반환하면 자동으로 복사 생성자 대신 사용됩니다.

편집 : RVO가 작동 할 때 RVO가 가장 좋은 옵션이라고 말하는 것에 동의하지만 "가능성이있는 복사 elision"이 충분하지 않은 경우 (즉, 매우 비싼 복사본) 이동 생성자를 구현해야합니다.

+0

이 경우 이동 의미는 대부분 C++ 98에 이미 존재하는 (N) RVO의 공식화입니다. –

+0

@BenjaminBannier : IIRC RVO의 효과는 컴파일러와 결과가 반환되는 방식 (일시적 반환 또는 로컬 변수 반환, 여러 반환 ...)에 따라 달라 지지만 이동 의미는 예측 가능한 결과를 나타냅니다. – heinrichj

0

예, 참조를 반환 할 수 있지만 함수의 로컬 변수가 아닌 객체의 필드에 take care of return a reference을 반환하십시오.

그리고 물체의 수명 동안에 만 mantain을 참조하십시오.

1

값으로 돌아오고 컴파일러가 RVO를 돕는 것이 가장 좋을 것입니다.

함수가 항상 선언 된 인스턴스를 반환하도록 컴파일러에 "도움"하는 한 가지 방법 (그리고 다른 모든 인스턴스 - 도중에 조건에 따라 달라질 때).

isntance 할 경우

bar f() { 
    bar revtal; 
    .. 
    return retval 
} 

하지만

bar f() { 
    bar retval1; 
    bar retval2; 
    if(somecondition) 
    return retval1; 
    else return 
    retval2; 

} 
관련 문제