C++ static_cast 运行时开销

25

请查看下面的代码。

a) 在这种情况下(简单继承,没有虚成员),B::df()中的static_cast是否有任何开销(无论如何)? 我发现类似问题的答案有些矛盾,这就是为什么我在问这个问题...

b) 我正在考虑将A中的const M1 * func设置为私有,并引入一个新的私有字段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(); }

1个回答

55

static_cast<T>(e) 相当于以下方式中创建了一个虚构临时变量v:

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

静态转换(static_cast)的运行时成本正好是上述语句的成本。

那么,每次调用B::df()时创建临时对象确实会增加一些开销。从这个角度来看,为了避免临时对象的出现,将一个额外的成员变量存储在B中可能是有优势的。对吧? - Petr
19
@Petr: 你正在进行指针转换。指针的副本 (可能会被编译器优化掉) 是一个微不足道的操作。我不会试图对其进行优化。 - Armen Tsirunyan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接