C++中将基类实例转换为派生类实例的高性能最优解决方案是什么
最优实现方案(性能优先)
前提:旧库Base类不可修改,当前派生类Derived无额外成员变量、无虚函数,与Base内存布局完全一致。
方案1:零开销最优方案(无需类型转换)
核心需求仅为比较两个Base实例的a成员值,完全不需要构造Derived实例,可直接在Derived中新增静态比较方法,利用继承权限访问Base的protected成员,性能与直接比较两个int完全一致,无任何额外开销:
class Derived : public Base{ public: // 原有构造保留,如果其他场景需要 using Base::Base; // 原有成员函数保留,如果其他场景需要 bool is_greater(const Derived &y) const { return a > y.a; } // 新增静态比较方法,直接接收Base实例 static bool is_greater(const Base& b1, const Base& b2) { return b1.a > b2.a; } };
调用时直接用静态方法即可,完全跳过类型转换步骤:
int main(){ Base b1(10), b2(20); // 从旧库获取实例 bool res = Derived::is_greater(b1, b2); }
方案2:必须转换为Derived实例的场景
如果业务要求必须得到Derived实例做后续其他操作,给Derived添加inline转换构造函数即可,仅调用基类拷贝构造,开销仅为1个int的拷贝,编译器开启优化后会完全抹平额外成本:
class Derived : public Base{ public: // 新增转换构造函数,inline修饰提示编译器优化 inline Derived(const Base& b) : Base(b) {} bool is_greater(const Derived &y) const { return a > y.a; } };
即可直接编译运行常规调用逻辑:
int main(){ Base b1(10), b2(20); // 从旧库获取实例 Derived d1 = b1, d2 = b2; bool res = d1.is_greater(d2); }
禁止使用的错误方案
- 直接对
Base值对象使用static_cast<Derived>向下转型:属于未定义行为,只有当基类实例实际为派生类实例时才合法,当前场景旧库返回的是纯Base实例,不满足要求。 - 随意使用
reinterpret_cast强转指针/引用:可维护性极差,后续给Derived新增成员会直接导致内存越界,仅在极端明确内存布局的场景可酌情使用,常规场景完全不推荐。
内容的提问来源于stack exchange,提问作者LI.LE
相关产品推荐
相关产品推荐

