我正在开发一个库,其中一个公共接口类定义为:
class speed:
public:
//constructors, operators, setter, getters...
private:
float x,y,z;
};
我想在这里我又重新发明了轮子。使用像Eigen::vector3f
(或其他已知的第三个库中的任何其他替代品)而不是简单的float x,y,z
作为私有成员变量的东西比重写所有算术运算符照顾所有角落情况要好得多。
同时,我不想在我的库中公开任何第三方(这是我必须要满足的要求)。
向前声明Eigen::vector3f
或任何其他精心设计的浮动向量并在合适的智能指针中使用它是否明智?
不陷入基于意见的问题风格:
这是一个软件工程问题,因此,答案最有可能基于意见。
我的建议:
提供一个函数,在给定Eigen::vector3f
对象的情况下返回speed
。该函数是成员函数还是非成员函数是次要的,尽管非成员函数是优选的。
鉴于此,无论您使用三个float
s还是Eigen::vector3f
存储内部数据都是无关紧要的。
使用这种方法有任何可能的风险吗?
我没有看到任何。但是,我没有在任何项目中使用过Eigen::vector3f
。我的风险评估可能不合适。
从理论上讲,它是否会降低性能,因为数据是动态分配的?
我不明白为什么会这样。如果要动态分配speed
对象,则此类分配的成本将与是否存储三个float
s或Eigen::vector3f
作为成员变量无关。
你正在用重型机械(Eigen::vector3f
)和增加维护工作(实施pimpl成语)来衡量重新发明轮子的成本。如果您的应用程序不关心底层机制,即Eigen::vector3f
可以与Boost.Units
或其他专业库交换,那么pimpl习惯用法可能是合适的。如果您有一个需要遵守OSI许可项目许可证的封闭源应用程序(如Qt),情况就更是如此。优点是,如果由于法律原因或者因为项目不再可用/死亡而需要在将来切换,那么pimpl成语就可以解决这个问题。
至于性能下降,您可能会增加内存使用/分配/阻碍编译器优化的能力。但这些都是假设的。与任何其他情况一样,唯一的方法是测量/基准测试。我发现处理物理的应用程序更有可能在其他领域遇到瓶颈。