【问题标题】:C++ static_cast runtime overheadC++ static_cast 运行时开销
【发布时间】:2015-11-25 06:29:34
【问题描述】:

请看下面的代码。

a) 在这种情况下(简单继承,没有虚拟成员),B::df() 中的静态转换是否有任何开销(无论如何)?我发现了一些类似问题的相互矛盾的答案,这就是我问的原因......

b) 我正在考虑在 A 中将 const M1 * func 设为私有,并在 B 中引入一个新的私有字段 const M2 * func 以避免强制转换,但这会使事情复杂化并使智能指针的使用更加困难。你有没有更好的方法来避免演员表?


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(); }

【问题讨论】:

    标签: c++ runtime overhead static-cast


    【解决方案1】:

    static_cast&lt;T&gt;(e) 相当于通过以下方式创建一个发明的临时变量 v:

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

    static_cast 的运行时成本正是上述语句的成本

    【讨论】:

    • 所以每次调用 B::df() 时创建临时对象都会产生一些开销。从这个角度来看,在 B 中再存储一个成员变量以避免临时变量可能是有利的。对吗?
    • @Petr:您正在投射指针。指针的副本(无论如何都可能被编译器优化掉)是一个可以忽略的操作。我不会尝试优化它
    猜你喜欢
    • 2013-10-07
    • 2020-10-27
    • 2012-12-28
    • 1970-01-01
    • 2013-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多