Я только что опробовал небольшой эталон кастов (на моем ~ 3-летнем нетбуке, так что цифры довольно высокие, но хорошо).Это тестовая установка:
class A {
public:
virtual ~A() {}
};
class B : public A {
};
#define IT(DO) \
for (unsigned i(1<<30); i; i--) { \
B* volatile b(DO); \
(void)b; \
}
#define CastTest(CAST) IT(CAST<B*>(a))
#define NullTest() IT(NULL)
int main(int argc, char** argv) {
if (argc < 2) {
return 1;
}
A* a(new B());
switch (argv[1][0]) {
case 'd':
CastTest(dynamic_cast)
break;
case 's':
CastTest(static_cast)
break;
default:
NullTest()
break;
}
return 0;
}
Я обнаружил, что она сильно зависит от оптимизации компилятора, поэтому вот мои результаты:
(см. Оценка ниже)
O0:
g++ -O0 -Wall castbench.cpp; time ./a.out _; time ./a.out s; time ./a.out d
real 0m7.139s
user 0m6.112s
sys 0m0.044s
real 0m8.177s
user 0m6.980s
sys 0m0.024s
real 1m38.107s
user 1m23.929s
sys 0m0.188s
O1:
g++ -O1 -Wall castbench.cpp; time ./a.out _; time ./a.out s; time ./a.out d
real 0m4.412s
user 0m3.868s
sys 0m0.032s
real 0m4.653s
user 0m4.048s
sys 0m0.000s
real 1m33.508s
user 1m21.209s
sys 0m0.236s
O2:
g++ -O2 -Wall castbench.cpp; time ./a.out _; time ./a.out s; time ./a.out d
real 0m4.526s
user 0m3.960s
sys 0m0.044s
real 0m4.862s
user 0m4.120s
sys 0m0.004s
real 0m2.835s
user 0m2.548s
sys 0m0.008s
O3:
g++ -O3 -Wall castbench.cpp; time ./a.out _; time ./a.out s; time ./a.out d
real 0m4.896s
user 0m4.308s
sys 0m0.004s
real 0m5.032s
user 0m4.284s
sys 0m0.008s
real 0m4.828s
user 0m4.160s
sys 0m0.008s
Редактировать: Оценка
Для одного приведения (в приведенном выше тесте у нас было 2**30
приведений) мы получаем следующие моменты в минимальном примере выше:
-O0 71.66 ns
-O1 71.86 ns
-O2 -1.46 ns
-O3 -0.11 ns
Отрицательные значения, вероятно, связаны с различными нагрузками в момент выполнения программы и достаточно малы, чтобы их можно было отбросить как незначительные (т. Е. == 0).Поскольку здесь нет никаких накладных расходов, мы должны предположить, что компилятор был достаточно умен, чтобы оптимизировать отбрасывание, даже если мы сказали, что b
был изменчивым.Следовательно, единственными надежными значениями являются результаты 70 нс.