제 질문은 C++ 클래스 정의와 관련이 있습니다. 클래스에 멤버 변수가 많은 경우 이해합니다. 클래스의 크기가 증가합니다. 그러나 클래스 멤버 함수의 수를 늘리면 크기에 영향을주지 않습니다. 그러나, 나는 더 많은 멤버 함수를 가진 클래스와 더 적은 멤버 함수를 가진 클래스 사이의 가장 큰 차이점이 무엇인지 궁금해했다. 멤버 함수가 적은 클래스를 호출하는 것이 훨씬 빠를 수 있습니까?클래스 멤버 함수 번호의 효과
답변
아니요,이 모든 측면에서 차이를 만드는 유일한 종류의 기능은 가상 기능뿐입니다. 사용자의 수에 관계없이 일반적인 종류보다 현저히 느립니다. 다른 모든 경우 컴파일러는 특정 함수가 호출 될 때 실행할 코드를 정확히 알고 있으므로 검색을 수행 할 필요가 없으며 메소드의 수가 중요하지 않습니다.
아니요, 멤버 함수의 수는 함수를 호출하는 속도에 영향을 미치지 않습니다 (적어도 정상적인 구현에서는). 함수에 대한 모든 호출은 함수 매개 변수를 설정 한 다음 호출 명령어를 사용하는 코드로 컴파일됩니다. 컴파일러는 컴파일 타임에 함수의 주소를 확인하고 호출 명령어에서이를 사용하거나 가상 함수를 사용하여 호출 할 주소를 테이블에서 조회합니다.
멤버 변수를 저장하려면 인스턴스 단위 공간이 필요하지만 멤버 함수는 적어도 직접 인스턴스의 일부가 아닙니다. 일반적으로 각 추가 가상 멤버 함수에 필요한 추가 포인터가 하나 있지만 클래스의 모든 인스턴스간에 공유되는 vtable으로 이동하므로 멤버 별 크기에 추가되지 않습니다.
가상 멤버가 아닌 함수는 코드 메모리에서만 공간을 차지합니다. 공간 요구 사항은 자립 함수와 다르지 않으며 유일한 차이는 포인터를 this
에 전달할 때의 숨겨진 매개 변수입니다.
클래스에 추가 된 첫 번째 가상 함수는 인스턴스를 저장하는 데 필요한 공간에 여분의 포인터를 추가합니다. 추가적인 비 가상 멤버 함수는 공간 요구 사항을 전혀 재생하지 못합니다.
기능이 적은 클래스는 클래스가있는 클래스보다 효율적입니다.
함수 효율은 알고리즘 및 I/O의 영향을 가장 크게받습니다.
그러나 컴파일 시간에는 영향을 미칩니다.
- 1. 전화 기본 클래스 멤버 함수
- 2. 템플릿 클래스 멤버 함수 전문화?
- 3. 같은 클래스의 다른 멤버 함수 내에서 클래스 멤버 함수 호출
- 4. 함수 포인터 (클래스 멤버 함수)의 HashMap
- 5. 클래스 멤버로서의 클래스 멤버 함수 포인터
- 6. 함수 포인터가 멤버 함수
- 7. 비 정적 멤버 함수에 대한 C++ 함수 포인터 (클래스 멤버)
- 8. VC++ 디버거에서 클래스 멤버 함수 호출
- 9. Java 클래스, 함수 및 Javadoc이없는 멤버 찾기
- 10. C++ 클래스 객체 포인터와 액세스하는 멤버 함수
- 11. boost :: bind 및 클래스 멤버 함수
- 12. 클래스 멤버 변수가있는 C++ 함수 포인터 맵
- 13. 템플릿 멤버 함수 비 템플릿 클래스 T
- 14. 함수 클래스/멤버 함수의 프로토 타입
- 15. Eval()을 통한 클래스 호출 멤버 함수
- 16. 클래스 선언 이전 클래스의 멤버 함수 호출
- 17. 클래스, 멤버 함수 및 별도의 컴파일
- 18. stl 클래스 멤버 함수 결과 remove_if
- 19. 클래스 템플릿의 정적 함수 포인터 멤버
- 20. 정적 멤버 함수 의미론
- 21. const 멤버 함수 호출
- 22. 템플릿 클래스 및 유형 반환 함수 유형에 대한 멤버 함수
- 23. 클래스 멤버 함수 내에서 함수 객체 선언 및 정의
- 24. 다형 멤버 함수 포인터
- 25. 정적 멤버 함수
- 26. 비 클래스 함수 포인터로 클래스 멤버 함수를 호출하는 방법은 무엇입니까?
- 27. 오버로드> 멤버 함수
- 28. 기본 클래스 멤버 함수는 하위 클래스 멤버 함수에 직접 액세스합니까?
- 29. 클래스 멤버
- 30. 클래스와 멤버 함수 매핑하기
그냥 호기심에서 ... 어떻게이 질문을 생각해 냈습니까? – Qnan
* 컴파일하는 데 시간이 오래 걸리지 만 그 이후에는 아무런 차이가 없습니다. 컴파일러는 각 함수를 직접 호출하는 방법을 파악합니다. –