2012-08-03 5 views
4

제 질문은 C++ 클래스 정의와 관련이 있습니다. 클래스에 멤버 변수가 많은 경우 이해합니다. 클래스의 크기가 증가합니다. 그러나 클래스 멤버 함수의 수를 늘리면 크기에 영향을주지 않습니다. 그러나, 나는 더 많은 멤버 함수를 가진 클래스와 더 적은 멤버 함수를 가진 클래스 사이의 가장 큰 차이점이 무엇인지 궁금해했다. 멤버 함수가 적은 클래스를 호출하는 것이 훨씬 빠를 수 있습니까?클래스 멤버 함수 번호의 효과

+2

그냥 호기심에서 ... 어떻게이 질문을 생각해 냈습니까? – Qnan

+0

* 컴파일하는 데 시간이 오래 걸리지 만 그 이후에는 아무런 차이가 없습니다. 컴파일러는 각 함수를 직접 호출하는 방법을 파악합니다. –

답변

2

아니요,이 모든 측면에서 차이를 만드는 유일한 종류의 기능은 가상 기능뿐입니다. 사용자의 수에 관계없이 일반적인 종류보다 현저히 느립니다. 다른 모든 경우 컴파일러는 특정 함수가 호출 될 때 실행할 코드를 정확히 알고 있으므로 검색을 수행 할 필요가 없으며 메소드의 수가 중요하지 않습니다.

+3

* 어떤 표준에 따라 * 상당히 느립니다? 가상 함수 디스패치는 대부분의 경우 단 하나의 간접 지정으로 매우 효율적입니다. –

+0

@ DavidRodríguez-dribeas 그는 분명히 비회원 멤버 함수보다 훨씬 느린 것을 의미했습니다. – log0

+0

@ DavidRodríguez-dribeas 효율은 물론 상대적인 용어입니다. 그러나 실제로 성능이 중요한 비트의 경우 비 가상 메서드를 사용하는 것이 좋습니다. – Qnan

1

아니요, 멤버 함수의 수는 함수를 호출하는 속도에 영향을 미치지 않습니다 (적어도 정상적인 구현에서는). 함수에 대한 모든 호출은 함수 매개 변수를 설정 한 다음 호출 명령어를 사용하는 코드로 컴파일됩니다. 컴파일러는 컴파일 타임에 함수의 주소를 확인하고 호출 명령어에서이를 사용하거나 가상 함수를 사용하여 호출 할 주소를 테이블에서 조회합니다.

4

멤버 변수를 저장하려면 인스턴스 단위 공간이 필요하지만 멤버 함수는 적어도 직접 인스턴스의 일부가 아닙니다. 일반적으로 각 추가 가상 멤버 함수에 필요한 추가 포인터가 하나 있지만 클래스의 모든 인스턴스간에 공유되는 vtable으로 이동하므로 멤버 별 크기에 추가되지 않습니다.

가상 멤버가 아닌 함수는 코드 메모리에서만 공간을 차지합니다. 공간 요구 사항은 자립 함수와 다르지 않으며 유일한 차이는 포인터를 this에 전달할 때의 숨겨진 매개 변수입니다.

클래스에 추가 된 첫 번째 가상 함수는 인스턴스를 저장하는 데 필요한 공간에 여분의 포인터를 추가합니다. 추가적인 비 가상 멤버 함수는 공간 요구 사항을 전혀 재생하지 못합니다.

1

기능이 적은 클래스는 클래스가있는 클래스보다 효율적입니다.

함수 효율은 알고리즘 및 I/O의 영향을 가장 크게받습니다.

그러나 컴파일 시간에는 영향을 미칩니다.

관련 문제