2012-11-28 4 views
4

즉, 함수의 정의가 파생 클래스에서 변경되고 해당 파생 클래스의 동적 할당 메모리에 대한 포인터가 변경된 함수를 호출하면 컴파일러는 "알 수없는"이유는 무엇입니까? 특히 기본 클래스가 아닌 호출되어야합니다?가상 키워드가 필요한 이유가 무엇입니까?

가상 키워드가 프로그래머의 이익을 위해 작동하지 않는 경우가 있습니까?

+4

'가상'을 사용하지 않을 경우의 이점은 무엇입니까? 오버 헤드가 없습니다! –

+0

확실한 대답은 확실하지 않지만 가상 키워드가 있으면 실행시 가상 포인터 테이블이 설정된다는 것을 의미합니다. 이는 성능에 약간의 영향이있을 수 있습니다. – ScoPi

+0

http://en.wikipedia.org/wiki/Virtual_method_table –

답변

6

virtual 키워드는 컴파일러에 동적 디스 패치을 구현하도록 지시합니다. 이것은 언어가 설계된 방법입니다. 이러한 키워드가 없으면 컴파일러는 동적 디스패치를 ​​구현할지 여부를 알 수 없습니다. 일반적으로

virtual의 단점 또는 동적 파견 그것은 약간의 성능 저하가

  • 점이다. 대부분의 컴파일러는 vtable 및 vptr 메커니즘을 사용하여 동적 디스패치를 ​​구현합니다. 여기서 적절한 호출 기능은 vtable을 통해 결정되므로 동적 디스패치의 경우 추가적인 간접 참조가 필요합니다.
  • 수업을 Non-POD로 만듭니다.
+2

가상 함수는 비 - 가상 함수와 비교할 때 "오버 헤드"가 있습니다. 동일한 의미에서 이진 검색은 Quicksort보다 빠릅니다. 그들은 다른 일을하기 때문에 비교는 의미가 없습니다. 동적 디스패치가 필요한 경우 가상 함수를 사용하거나 가상 함수처럼 "느린"자체 다이나믹 디스패치 메커니즘을 구현합니다. – fredoverflow

+0

@FredOverflow : 코스에 대한 개념, 말에 동의합니다. 동적 디스패치 기능이 필요한 경우 일반 정적 바인딩 기능과 비교하여 기능에 약간의 성과가 있습니다.동의, 사과와 배를 비교하는 것 같아요. –

+0

나는 사과를 더 좋아한다. – fredoverflow

0

컴파일러는 알 수 없으므로 알 수 없습니다. 가상 기능을 사용하지 않으려는 의도 일 수도 있습니다. 왜냐하면 모든 기능과 관련된 비용이 항상 있기 때문입니다.

+0

당신이 정말로 원하는 것을 지불해야합니다. 뭔가 줄 수 있어야합니다. –

2

한 가지 이유 :

라이브러리와 같은 별도의 모듈에있는 기본 클래스를 생각해 보자.

그리고 응용 프로그램에서 파생 된 클래스.

컴파일러는 주어진 함수가 가상이어야한다는 것을 라이브러리를 컴파일하는 동안 어떻게 알 수 있습니까?

+0

이것이 OP의 질문을 가장 잘 나타내는 대답이라고 생각합니다. 컴파일러는 클래스를 컴파일하는 순간에 메소드가 실제로 사용되는지 여부를 추측 할 수 없습니다. –

관련 문제