在公共标头中使用非暴露类型的风险是什么?

What are the risks of using non exposed type in the public headers

本文关键字:类型 暴露 是什么      更新时间:2023-10-16

我正在开发一个库,其中一个公共接口类定义为:

class speed:
public:
    //constructors, operators, setter, getters...
private:
    float x,y,z; 
};

我认为在这里我再次重新发明了轮子。使用诸如Eigen::vector3f(或其他已知3rd库中的任何其他替代方案),而不是普通float x,y,z作为私人成员变量,比重新编写所有算术操作员要照顾所有Corners Case都要优越。

同时,我不想用我的图书馆公开任何第三方(这是我必须见面的要求)。

转发声明Eigen::vector3f或任何其他精心设计的Float向量并在合适的智能指针中使用它是明智的吗?

不要陷入基于意见的问题样式:

  • 是否使用这种方法可能会有可能的风险?
  • 理论上会降低性能,因为数据是动态分配的?

这是一个软件工程问题,因此,答案最有可能基于意见。

我的建议:

提供一个返回Eigen::vector3f给定speed对象的函数。该函数是成员函数还是非会员函数是次要的,尽管非会员函数是可取的。

考虑到这一点,无论您是使用三个float S还是Eigen::vector3f存储内部数据。

使用这种方法有可能风险吗?

我看不到。但是,我在任何项目中都没有使用Eigen::vector3f。我的风险评估可能会脱离目标。

理论上会降低性能,因为数据是动态分配的?

我不明白为什么会。如果您要动态分配speed对象,则此类分配的成本将独立于您存储三个float S还是Eigen::vector3f作为成员变量。

您正在权衡用稍微沉重的机械(Eigen::vector3f)重新发明轮子和增加维护工作(实施PIMPL成语)的成本。如果您的应用程序不在乎基础机械,则可以用Boost.Units或其他一些专业库将Eigen::vector3f交换,那么PIMPL成语可能是合适的。如果您有一个封闭的源应用程序需要遵守OSI许可项目(例如QT)的许可,则更是如此。优势在于,如果您由于法律原因而将来需要切换,或者因为该项目不再可用/死亡,那么Pimpl习惯就可以放松。

至于性能降解,您可能会增加内存使用/分配/阻碍编译器优化的能力。但是这些是假设的。像其他任何情况一样,唯一知道的方法是测量/基准。我发现处理物理的应用程序更有可能在其他领域具有瓶颈。