假设我做了类似
的事情class Double {
double m_double;
public:
Double() { }
Double(double d) : m_double(d) { }
operator double() const { return m_double; }
operator double&() { return m_double; }
};
也许我后来想扩展这个以使NaN更加友好(通过添加bool说)等等。
我的问题是,你是否认为这个Double(及其上的可能扩展)比直接使用内置double更“慢”?
如果您在处理大型数据集,使用向量,复制/移动此类数据的向量等方面有一些经验 - 我希望您能根据您的经验向我提供有关此主题的一些具体见解/指示/提示
答案 0 :(得分:2)
现代编译器做了很好的优化。包含在类中的单个标量通常与普通标量一样好。如果您向成员运营商添加额外的检查,那么它将花费您添加的成本。如果你需要应用额外的限制加倍,那么这是个好主意。
示例: std::array<T,N>
它本质上只是一个数组。我没有找到与原始数组进行比较时显示任何开销的测试。增加的限制和类似容器的功能使其变得有价值。
避免将运算符静默转换为operator double()
之类的标量。编译器非常容易地将隐式转换应用于拼写错误,有时可以实现编译缺陷。后来需要一些时间才能意识到为什么它会像它一样工作。使转化更明确,如double raw() const
。生成的代码更容易理解,运行速度更快。
示例: std::array<T,N>
不会像普通数组一样转换为第一个元素的原始指针。用户必须使用&a[0]
来获取指向第一个元素的原始指针。这使得它在代码中更安全,更容易理解。它工作得很快(优化代码中的操作成本为0)。