在 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。我发现处理物理的应用程序更有可能在其他领域遇到瓶颈。
我正在开发一个库,其中一个 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。我发现处理物理的应用程序更有可能在其他领域遇到瓶颈。