2012-11-14 3 views
-1

두 클래스가 foobar인데 하나는 다른 클래스의 수퍼 클래스이고 두 메서드 모두 hello_world입니다.C++ 가상 함수 성능

class foo { 
    virtual void hello_world(); 
}; 
class bar : public foo { 
    void hello_world(); 
}; 

내 질문은 : 어떤 성능 차이가 나는 barhello_world에 대한 가 가상 할 경우? 그것은이 될 것이다 : 나는 주로 bar에서 hello_world를 호출합니다

class foo { 
    virtual void hello_world(); 
}; 
class bar : public foo { 
    virtual void hello_world(); 
}; 

. 가상 함수가 기능을 느리게 만들 수 있다는 것을 알고 있습니다. 런타임을 조회하기 때문에 입니다. 그러나이 경우에는 어떤 차이가 있습니까?

+3

예제 코드가 구문 적으로 유효하지 않기 때문에 당신이 묻는 것을 정확히 알기가 어렵습니다. 그러나 이미 가상 함수 (가상 함수로 상속 되었기 때문에)에 가상 키워드를 추가하면 성능이 변경되는지 여부를 묻는 경우에는 '가상'키워드가 아무런 영향을 미치지 않습니다 . –

+0

합리적인 테스트를 설정하면 실제로 측정 할 수 있습니다. 몇 년 전의 일을 정확히 기억하고 있으며 오버 헤드가 걱정할 가치가 없다는 것을 알았습니다. 어쩌면 당신의 어플리케이션에 대해 걱정할 가치가 있을지 모르나 나는 의심 스럽다. – paddy

+1

이 질문은 종료되어서는 안됩니다. 그것은 구체적이고, 답답하며 주제에 관한 것입니다. –

답변

3

클래스가 실제로 다형성을 가질 수있는 컨텍스트에서 가상 함수를 호출하면 인라인 할 수있는 동일한 논리를 가진 함수와 비교할 때 항상 성능에 약간의 영향이 있습니다. 주된 이유는 함수를 호출하는 오버 헤드가 작고, 호출해야하는 함수를 찾는 데 약간의 오버 헤드가 발생하며, 최적화 기회가 많이 손실된다는 것입니다. 마지막 지점은 일반적으로 가장 비싼 지점입니다.

원래 예제가 컴파일되지 않았습니다. 즉, 성능 분석이 수행되지 않았 음이 분명합니다. 코드가 너무 느리게 실행되고 특정 통화가 실제로 성능 문제가 발생하는 영역에 있다고 판단한 후에는 성능에 미치는 영향에 대해 걱정할 필요가 있습니다.

+0

그의 코드에있는 hello_word() 멤버는 bar :: hello_word()에서 virtual 키워드를 사용하는지 여부에 관계없이 모두 비공개 가상입니다. –

+0

제 독서에서, 이것은 장난감 응용 프로그램은 물론 대부분의 실제 응용 프로그램에서 가상 기능에 의해 수행 된 성능을 과장합니다 (약간). –

+0

Öö Tiib : 예, 함수가 'private'인지 여부는 중요하지 않습니다. 파생 클래스가 기본 클래스의 '가상'함수의 서명과 일치하는 함수를 갖고 있으면 함수를 재정의합니다. –