1

所以假设我做类似的事情

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 say)等。

我的问题是,你是否认为这个 Double (以及可能的扩展)会比直接使用内置的 double 慢得多?

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

4

1 回答 1

2

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

示例: std::array<T,N>它是......本质上只是一个数组。与原始数组相比,我未能找到证明任何开销的测试。增加的限制和类似容器的功能使其有价值。

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

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

于 2013-02-20T02:38:47.377 回答