在 public headers 中使用非暴露类型有什么风险

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

我正在开发一个库,其中一个 public 接口 class 定义为:

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

我觉得我又是re-inventing轮子了。使用 Eigen::vector3f 之类的东西(或来自另一个已知的第三个库的任何其他替代方案)而不是普通的 float x,y,z 作为私有成员变量比 re-writing 所有算术运算符都处理所有角落情况要好得多.

同时,我不想将我的图书馆暴露给任何第三方(这是我必须满足的要求)。

转发声明 Eigen::vector3f 或任何其他 well-designed 浮点向量并在合适的智能指针中使用它是否明智?

不要陷入 opinion-based 问题风格:

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

我的建议:

提供一个 returns 给定 speed 对象的 Eigen::vector3f 的函数。该函数是成员函数还是非成员函数是次要的,但最好是非成员函数。

鉴于此,使用三个 float 还是 Eigen::vector3f 存储内部数据并不重要。

Is there any possible risk by using this approach?

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

Would it, theoretically, decrease the performance since the data is dynamically allocated?

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

您正在权衡使用重型机械 (Eigen::vector3f) 和增加维护工作量(实施 pimpl 惯用语)重新发明轮子的成本。如果您的应用程序不关心底层机制,即 Eigen::vector3f 可以与 Boost.Units 或其他一些专门的库交换,那么 pimpl 习惯用法可能是合适的。如果您有一个闭源应用程序需要遵守 OSI 许可项目(如 Qt)的许可,则更是如此。优点是,如果您将来由于法律原因或因为项目不再 usable/dead 而需要切换,pimpl idiom 可以简化这种情况。

至于性能下降,您可能会获得增加内存usage/allocations/hinder编译器优化的能力。但这些都是假设。与任何其他情况一样,唯一知道的方法是 measure/benchmark。我发现处理物理的应用程序更有可能在其他领域遇到瓶颈。