琐碎的解决方案是:
class Number
{
public:
bool isFinite();
bool isPositive();
double value();
...
private:
double value_;
bool isFinite_;
bool isPositive_;
...
};
令我担心的是效率:
来自Effective C ++:55改进程序和设计的具体方法(第3版)作者:Scott Meyers:
即使小物件具有廉价的复制构造器,也可以 是性能问题。一些编译器处理内置和用户定义 类型不同,即使它们具有相同的底层 表示。例如,一些编译器拒绝放置对象 尽管他们很开心,但只有一个双人进入一个寄存器 定期在那里裸体双打。当那种事情 碰巧,您最好通过引用传递这些对象, 因为编译器肯定会放指针(执行 参考)到寄存器。
有没有办法绕过效率问题?例如,使用某种汇编语言魔法的库?
答案 0 :(得分:6)
没有理由为double实现Number类。 double格式已经将Infinity,NaN和signage实现为raw basic double类型的一部分。
其次,您应首先编写代码以确保正确性,然后再尝试优化,此时您可以查看特定数据结构的因素并重写代码和算法。
现代编译器在编写优秀代码时通常非常有效,并且通常比大多数人类程序员做得更好。
答案 1 :(得分:2)
对于特定的示例,我只会使用双打而不是类。它们很好地适应和定义处理无穷大。
从更一般的意义上说,你应该使用简单的解决方案,只有在(或者更有可能的话)成为问题时才会担心性能。
这意味着将其编码并在您将要使用它的许多场景中对其进行测试。
如果它仍然在您的性能要求范围内执行,请不要担心尝试优化它。你应该 某些性能要求稍微具体一点“我希望它尽可能快地运行”: - )
请记住,效率 始终意味着“尽可能快,无论成本”。这意味着实现您的目标,而不必牺牲其他东西(如可读性或可维护性)。
如果您采取完整的操作使用户等待0.1秒并将其优化到快10倍的程度,用户根本不会注意到(我说“完整”,因为显然,用户如果在没有某种中期结果的情况下完成了一万次,会注意到差异。)
请记住,测量,不要猜测!