2016-06-21 16 views
7

나는 쇼가() 가상 함수를 넣고, 모양 다형성에 대한 예를 참조하십시오. 후기 바인딩과 초기 바인딩의 차이점을 이해합니다. 그러나이 예제에서 우리는 (그리고 아마 컴파일러도 마찬가지입니다) ptr이 가리키는 오브젝트에는 아무런 변화가 없기 때문에 어떤 함수가 호출되어야 하는지를 알 수 있습니다. 왜 늦은 바인딩이 약간의 오버 헤드를 유발할 것인가?가능한 경우 초기 바인딩을 사용하지 않는 이유는 무엇입니까?</p> <pre><code>int main() { Derived dv1; Derived dv2; Base* ptr; ptr = &dv1; ptr->show(); ptr = &dv2; ptr->show(); } </code></pre> <p>책이 경우, 컴파일러는 <code>late binding</code> 기술을 사용하는 말 :

+4

컴파일러가 실제로 해당 사례를 감지하지 못하고이를 최적화하는지 어떻게 알 수 있습니까? 생성 된 어셈블러 코드를 확인 했습니까? 최적화가 활성화되어 있습니까? –

+0

어셈블러 코드에 익숙하지 않습니다. 이 책에서 후기 바인딩이이 경우에 적용된다고하는 사실 때문에 혼란 스럽습니다. – Rickie

+2

clang은 적어도 "show"의 간단한 구현을 위해 파생 된 호출을 최적화하는 것보다 [a * bit * more] (https://godbolt.org/g/9pnkg9)를 수행하는 것처럼 보입니다. – jaggedSpire

답변

8

그러나이 예제에서는 ptr이 가리키는 개체에 변경 사항이 없기 때문에 어떤 함수를 호출해야하는지 알 수 있습니다.

수정.

후기 바인딩이 일부 오버 헤드를 유발할 수 있으므로이 경우 초기 바인딩을 사용하지 않는 이유는 무엇입니까?

함수는 다형성 유형에 대한 포인터를 통해 호출되므로 후기 바인딩이 사용됩니다.

후기 바인딩은 단순히 Base::show에 대한 호출을 해결하는 것이 아니라 호출이 가장 파생 된 재정의 (개체의 구체적인 유형까지)로 해결된다는 것을 의미합니다.

일반적으로 지연 바인딩에는 동적 디스패치가 필요할 수 있지만 프로그램이 규칙을 따랐던 것처럼 프로그램이 여전히 작동하는 경우 구현시 규칙을 위반할 수 있습니다. 이를 as-if 규칙이라고합니다. 그리고 당신이 만든 관측으로 인해 정적 디스패치를 ​​수행하도록 프로그램을 변경해도 동작이 변경되지 않으므로 컴파일러는 동적 디스패치를 ​​최적화하고 피할 수 있습니다.

+1

이 기술은 _devirtualization_이라고합니다. GCC 구현에 대한 내용은 [블로그 게시물 시리즈] (http://hubicka.blogspot.ru/2014/01/devirtualization-in-c-part-1.html)에서 읽을 수 있습니다. –