2

简单的解决方案是:

class Number
{
public: 
    bool isFinite();
    bool isPositive();
    double value();

    ...

private:
    double value_;
    bool isFinite_;
    bool isPositive_;

    ...
};

我担心的是效率:

来自有效的 C++:改进程序和设计的 55 种特定方法(第 3 版),作者:Scott Meyers:

即使小对象具有廉价的复制构造函数,也可能存在性能问题。一些编译器以不同的方式处理内置类型和用户定义类型,即使它们具有相同的底层表示。例如,一些编译器拒绝将只包含双精度的对象放入寄存器中,尽管他们很乐意定期将裸双精度放在那里。当这种事情发生时,最好通过引用传递这些对象,因为编译器肯定会将指针(引用的实现)放入寄存器中。

有没有办法绕过效率问题?例如一个使用一些汇编语言魔法的库?

4

2 回答 2

6

几乎没有理由为 double 实现 Number 类。double 格式已经实现了 Infinity、NaN 和 signage 作为原始基本 double 类型的一部分。

其次,您应该首先编写代码以确保正确性,然后再尝试优化,此时您可以考虑分解出特定的数据结构并重写代码和算法。

现代编译器在编写好代码方面通常非常高效,并且通常比大多数人类程序员做得更好。

于 2012-05-16T04:28:09.110 回答
2

对于您的具体示例,我将按原样使用双打,而不是在课堂上使用。它们非常适合和定义用于处理无穷大。

在更一般的意义上,您应该使用微不足道的解决方案,并且只在(或者,更有可能,如果)它成为问题时才担心性能。

这意味着对它进行编码并在您将要使用它的许多场景中对其进行测试。

如果它仍然在您的性能要求范围内执行,请不要担心尝试对其进行优化。你应该一些更具体的性能要求,“我希望它尽可能快地运行”:-)

请记住,效率并不总是意味着“尽可能快,无论成本如何”。这意味着在不必牺牲其他东西(如可读性或可维护性)的情况下实现您的目标。

如果您进行一个使用户等待 0.1 秒的完整操作并将其优化到快十倍的程度,那么用户根本不会注意到这一点(我说“完成”,因为显然如果它做了一万次,没有某种临时结果)。

记住,测量,不要猜测!

于 2012-05-16T04:30:51.307 回答