在实践中,自定义Double类会比内置双倍慢吗?

时间:2013-02-20 02:29:28

标签: c++

假设我做了类似

的事情
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更“慢”?

如果您在处理大型数据集,使用向量,复制/移动此类数据的向量等方面有一些经验 - 我希望您能根据您的经验向我提供有关此主题的一些具体见解/指示/提示

1 个答案:

答案 0 :(得分:2)

现代编译器做了很好的优化。包含在类中的单个标量通常与普通标量一样好。如果您向成员运营商添加额外的检查,那么它将花费您添加的成本。如果你需要应用额外的限制加倍,那么这是个好主意。

示例: std::array<T,N>它本质上只是一个数组。我没有找到与原始数组进行比较时显示任何开销的测试。增加的限制和类似容器的功能使其变得有价值。

避免将运算符静默转换为operator double()之类的标量。编译器非常容易地将隐式转换应用于拼写错误,有时可以实现编译缺陷。后来需要一些时间才能意识到为什么它会像它一样工作。使转化更明确,如double raw() const。生成的代码更容易理解,运行速度更快。

示例: std::array<T,N>不会像普通数组一样转换为第一个元素的原始指针。用户必须使用&a[0]来获取指向第一个元素的原始指针。这使得它在代码中更安全,更容易理解。它工作得很快(优化代码中的操作成本为0)。