나는 쇼가() 가상 함수를 넣고, 모양 다형성에 대한 예를 참조하십시오. 후기 바인딩과 초기 바인딩의 차이점을 이해합니다. 그러나이 예제에서 우리는 (그리고 아마 컴파일러도 마찬가지입니다) 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> 기술을 사용하는 말 :
답변
그러나이 예제에서는 ptr이 가리키는 개체에 변경 사항이 없기 때문에 어떤 함수를 호출해야하는지 알 수 있습니다.
수정.
후기 바인딩이 일부 오버 헤드를 유발할 수 있으므로이 경우 초기 바인딩을 사용하지 않는 이유는 무엇입니까?
함수는 다형성 유형에 대한 포인터를 통해 호출되므로 후기 바인딩이 사용됩니다.
후기 바인딩은 단순히 Base::show
에 대한 호출을 해결하는 것이 아니라 호출이 가장 파생 된 재정의 (개체의 구체적인 유형까지)로 해결된다는 것을 의미합니다.
일반적으로 지연 바인딩에는 동적 디스패치가 필요할 수 있지만 프로그램이 규칙을 따랐던 것처럼 프로그램이 여전히 작동하는 경우 구현시 규칙을 위반할 수 있습니다. 이를 as-if 규칙이라고합니다. 그리고 당신이 만든 관측으로 인해 정적 디스패치를 수행하도록 프로그램을 변경해도 동작이 변경되지 않으므로 컴파일러는 동적 디스패치를 최적화하고 피할 수 있습니다.
이 기술은 _devirtualization_이라고합니다. GCC 구현에 대한 내용은 [블로그 게시물 시리즈] (http://hubicka.blogspot.ru/2014/01/devirtualization-in-c-part-1.html)에서 읽을 수 있습니다. –
컴파일러가 실제로 해당 사례를 감지하지 못하고이를 최적화하는지 어떻게 알 수 있습니까? 생성 된 어셈블러 코드를 확인 했습니까? 최적화가 활성화되어 있습니까? –
어셈블러 코드에 익숙하지 않습니다. 이 책에서 후기 바인딩이이 경우에 적용된다고하는 사실 때문에 혼란 스럽습니다. – Rickie
clang은 적어도 "show"의 간단한 구현을 위해 파생 된 호출을 최적화하는 것보다 [a * bit * more] (https://godbolt.org/g/9pnkg9)를 수행하는 것처럼 보입니다. – jaggedSpire