Накладные расходы времени выполнения C ++ static_cast

См. Код ниже.

a) Имеет ли в этом случае (простое наследование, без виртуальных членов) статическое приведение в B :: df () какие-либо накладные расходы (какие бы то ни было)? Я нашел несколько противоречивых ответов на подобные вопросы, поэтому и спрашиваю ...

б) Я думал о том, чтобы сделать const M1 * func закрытым в A и ввести новое закрытое поле const M2 * func в B, чтобы избежать приведения, но это как бы усложняет ситуацию и затрудняет использование интеллектуальных указателей. Видите ли вы лучший способ избежать повязки?


class M1 {
public:
    double f() const;
};

class M2 : public M1 { public: double df() const; };

class A { protected: const M1 * func; public: A(const M1 * p); ~A(); double f() const; };

class B : public A { public: B(const M2 * p); double df() const; };


double M1::f() const { return 1973.0; }
double M2::df() const { return 0.0; }

A::~A() { delete func; } A::A(const M1 * p) : func(p) {} double A::f() const { return func->f(); }

B::B(const M2 * p) : A(p) {} double B::df() const { return static_cast<const M2*>(func)->df(); }


person Petr    schedule 22.06.2011    source источник


Ответы (1)


static_cast<T>(e) эквивалентно созданию придуманной временной переменной v следующим образом:

T v(e); //where T is an arbitrary type  and e is an arbitrary expression.

Стоимость выполнения static_cast в точности равна стоимости приведенного выше оператора

person Armen Tsirunyan    schedule 22.06.2011
comment
Таким образом, у него есть некоторые накладные расходы на создание этого временного объекта каждый раз, когда вызывается B :: df (). С этой точки зрения было бы выгодно сохранить еще одну переменную-член в B, чтобы избежать временного. Верно? - person Petr; 23.06.2011
comment
@Petr: Вы вводите указатели. Копия указателя (которая в любом случае может быть оптимизирована компилятором) - это незначительная операция. Я бы не стал его оптимизировать - person Armen Tsirunyan; 23.06.2011