2009-08-14 6 views
16

C++에서 가상 함수가없는 기본 클래스를 상속하는 오버 헤드 (메모리/CPU)는 무엇입니까? 반원들에게 똑바로 띄운 복사 + 붙여 넣기만큼이나 좋은가요? 별로가상 함수가없는 C++ 상속의 오버 헤드

class a 
{ 
public: 
    void get(); 
protected: 
    int _px; 
} 

class b 
{ 
public: 
    void get(); 
protected: 
    int _px; 

} 
+5

가상 함수가없는 경우 공용 (공용) 상속을 사용하면 어떤 점이 있습니까? 최소한 가상 소멸자가 필요합니다. –

+8

@Neil은 코드 재사용을위한 것이므로 휠의 재발을 피할 수 있습니다. – vehomzzz

+5

이 경우 그는 합성, 사적 상속 또는 자유 기능을 사용해야합니다. –

답변

23

복사 과거에 비해 상속을 사용하는 경우, 다음 클래스 정의 고려 (때문에 패딩까지) 할 약간의 메모리 오버 헤드가 있습니다

struct A 
{ 
    int i; 
    char c1; 
}; 

struct B1 : A 
{ 
    char c2; 
}; 


struct B2 
{ 
    int i; 
    char c1; 
    char c2; 
}; 

를 sizeof (B1)는 아마 (를 sizeof 반면, 12이 될 것입니다 B2)는 단지 8 일 수 있습니다. 기본 클래스 A가 8 바이트로 별도로 채워지고 B1이 다시 12 바이트로 채워지기 때문입니다.

+0

아 좋은 관찰. – jameszhao00

+0

다른 모든 대답은 유효하지만 이것은 내가 몰랐거나 전에 생각한 것입니다. – jameszhao00

1

에 비해

class a 
{ 
public: 
    void get(); 
protected: 
    int _px; 
} 

class b : public a 
{ 

} 

, 그것은 단지 기본 클래스로 메모리 증가했다. here in C++ FAQ

+0

가상 함수가 도입되는 즉시 함수 테이블 비용이 있다는 것을 알고 있습니다. 어떻게 C++ 컴파일러가 다형성없이 상속을 처리하는지 궁금합니다. – jameszhao00

+0

하나는 vtable 용 메모리를 할당하지 않고 기본 클래스에 vpointer를 만들지 않으므로 컴파일러와 런타임 모두 가상 함수/dtors보다 적게 걸립니다. 너는 무엇을 성취하려고 하는가? – vehomzzz

14

컴파일에 약간 시간이 걸릴 것이므로 추가 런타임 오버 헤드가 발생하지 않습니다. 옵티 마이저의 관점에서 가상이 아닌 메소드는 프로 시저와 동일합니다. 가상 메소드 테이블의 오버 헤드없이 메모리 주소 만 사용하여 호출 할 수 있습니다.

+0

컴파일하는 데 시간이 오래 걸리는 이유는 무엇입니까? 단지 호기심. 나는 컴파일러가 요즘 충분히 똑똑하다고 생각했다 :) – vehomzzz

+6

컴파일러가 상속 트리를 만들어야하기 때문에 증가 된 시간은 단지 몇 밀리 초일 것이다. 걱정할 필요가 없습니다. –

+0

"상속받지 않은 방법과 동일하지 않습니까?" – einpoklum

3

가상 클래스 상속을 잊어 버린 경우 기본 클래스를 사용하면 메모리와 성능이 동일 해 지므로 같은 클래스의 멤버를 갖는 것입니다. 그것은 때로는 더 좋을 수도 있다는 것을 제외하고는 (예를 들어, 빈 클래스는 최소한 하나의 크기를 가지지 만 빈 기본 클래스는 종종 오버 헤드가 없을 수 있습니다).

2

Derived * 유형의 개체를 가리키는 Base * 유형의 포인터가있는 경우 가상 소멸자가 필요하며 원본 전제는 더 이상 적용되지 않습니다. 파생 클래스에 비어있는 소멸자가 있고 구성원이 없거나 모든 POD 유형 인 경우 가상 소멸자없이 도망 갈 수 있지만 일반적으로 안전하고 처음부터 가상으로 만드는 것이 좋습니다.

컴파일러는 각 비가 상 구성원 함수를 구현하는 코드에 대한 직접 호출을 생성하므로 오버 헤드가 없습니다.