Затраты времени выполнения C ++ static_cast - PullRequest
18 голосов
/ 23 июня 2011

См. Код ниже.

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

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

<code>
class M1 {
public:
    double f() const;
};</p>

<p>class M2 : public M1 {
public:
    double df() const;
};</p>

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

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

<code>
double M1::f() const { return 1973.0; }
double M2::df() const { return 0.0; }</p>

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

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

1 Ответ

47 голосов
/ 23 июня 2011

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

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

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

...