在公共标头中使用非暴露类型的风险是什么?
What are the risks of using non exposed type in the public headers
我正在开发一个库,其中一个公共接口类定义为:
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习惯就可以放松。
至于性能降解,您可能会增加内存使用/分配/阻碍编译器优化的能力。但是这些是假设的。像其他任何情况一样,唯一知道的方法是测量/基准。我发现处理物理的应用程序更有可能在其他领域具有瓶颈。
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 模板元程序查找相似的连续类型名称
- 是否可以从int转换为enum类类型
- 构造函数正在调用一个使用当前类类型的函数
- 在公共标头中使用非暴露类型的风险是什么?
- 我实现的Is_complete类型特征是否暴露了编译器错误