, 우리에 대한 virtual
C++ 함수, 그들은 는를 해결 (또는 는 일치, 나는 용어가 무엇인지 모르는, 또는 발견 - 우리가 영어 공부를하지 않는) 방법을 컴파일 시간 대신 실행 시간. 교사는 또한 컴파일 시간 해상도가 실행 시간보다 훨씬 빠르다고 말했습니다. 그러나 빠른 실험은 다른 방법을 제안합니다. 이 작은 프로그램을 만들었습니다 :실행 시간 방식의 해상도가 컴파일 시간 해상도보다 빠른 이유는 무엇입니까?
#include <iostream>
#include <limits.h>
using namespace std;
class A {
public:
void f() {
// do nothing
}
};
class B: public A {
public:
void f() {
// do nothing
}
};
int main() {
unsigned int i;
A *a = new B;
for (i=0; i < UINT_MAX; i++) a->f();
return 0;
}
나는 위의 프로그램을 컴파일하고 이름을 normal
으로 지정했습니다. 그럼, 다음과 같이 할 A
수정 :
class A {
public:
virtual void f() {
// do nothing
}
};
를 집계하고이를 virtual
이름. 결과는 다음과 같습니다.
[[email protected] C]$ time ./normal
real 0m25.834s
user 0m25.742s
sys 0m0.000s
[[email protected] C]$ time ./virtual
real 0m24.630s
user 0m24.472s
sys 0m0.003s
[[email protected] C]$ time ./normal
real 0m25.860s
user 0m25.735s
sys 0m0.007s
[[email protected] C]$ time ./virtual
real 0m24.514s
user 0m24.475s
sys 0m0.000s
[[email protected] C]$ time ./normal
real 0m26.022s
user 0m25.795s
sys 0m0.013s
[[email protected] C]$ time ./virtual
real 0m24.503s
user 0m24.468s
sys 0m0.000s
가상 버전에 비해 1 초 정도의 차이가 지속되는 것 같습니다. 왜 이런거야?
관련 항목 : 듀얼 코어 펜티엄 @ 2.80Ghz, 두 가지 테스트 사이에서 실행되는 추가 응용 프로그램 없음. gcc 4.5.0을 사용하는 Archlinux. 처럼, 일반적으로 컴파일 :
$ g++ test.cpp -o normal
는 또한, -Wall
중 하나, 경고를 뱉어하지 않습니다.
편집 : A.cpp
, B.cpp
및 main.cpp
에 내 프로그램을 분리 한. 또한, 나는 f()
(모두 A::f()
및 B::f()
) 함수는 실제로 이 (A::A()
1로 초기화 x
이 A
의 public
int
구성원 x = 0 - x
) 일을했다.
[[email protected] poo]$ time ./normal-unoptimized
real 0m31.172s
user 0m30.621s
sys 0m0.033s
[[email protected] poo]$ time ./normal-O2
real 0m2.417s
user 0m2.363s
sys 0m0.007s
[[email protected] poo]$ time ./normal-O3
real 0m2.495s
user 0m2.447s
sys 0m0.000s
[[email protected] poo]$ time ./virtual-unoptimized
real 0m32.386s
user 0m32.111s
sys 0m0.010s
[[email protected] poo]$ time ./virtual-O2
real 0m26.875s
user 0m26.668s
sys 0m0.003s
[[email protected] poo]$ time ./virtual-O3
real 0m26.905s
user 0m26.645s
sys 0m0.017s
최적화되지 않은 1 초 빠른 때 가상 아직도, 나는 조금 특이한 찾을 : 여섯 개 버전이 점을 컴파일, 여기 내 최종 결과입니다. 그러나 이것은 좋은 실험이었으며 귀하의 답변에 대해 모두 감사드립니다.
-O3 (레벨 3 최적화)을 사용해보실 수 있습니까? – CMircea
내가 찾는 용어는 * vtable *이라고 생각합니다. –
아, 또 다른 마이크로 벤치! Lovely, 나는 그들을 그리워하기 시작했다. – mdma