如何在C++中有效地实现无穷大和负无穷大支持算术
How to efficiently implement infinity and minus infinity supporting arithmetic in C++?
解决方案是:
class Number
{
public:
bool isFinite();
bool isPositive();
double value();
...
private:
double value_;
bool isFinite_;
bool isPositive_;
...
};
让我担心的是效率:
摘自《有效C++:改进程序和设计的55种具体方法》(第3版(,作者:斯科特·迈耶斯(Scott Meyers(:
即使小对象具有廉价的复制构造函数,也可以 是性能问题。某些编译器处理内置和用户定义的 类型不同,即使它们具有相同的基础 表示法。例如,一些编译器拒绝放置对象 只由一个双打成寄存器组成,即使他们很高兴 定期将裸体双打放在那里。当那种事情 发生时,最好通过引用传递此类对象, 因为编译器肯定会放置指针(实现 引用(放入寄存器。
有没有办法绕过效率问题?例如,使用某种汇编语言魔法的库?
理由为双精度实现 Number 类。 双精度格式已经实现了无限、NaN 和标牌作为原始基本双精度类型的一部分。
其次,你应该先以正确性为目标编写代码,然后再尝试优化,这时你可以查看分解出特定的数据结构并重写代码和算法。
现代编译器在编写好代码方面通常非常有效,并且通常比大多数人类程序员做得更好。
对于您的具体示例,我只会按原样使用双精度而不是在类中使用。它们非常适合处理无穷大。
在更一般的意义上,您应该使用微不足道的解决方案,并且只在(或者更有可能,如果(它成为问题时才担心性能。
这意味着要对其进行编码并在您将要使用它的许多方案中对其进行测试。
如果它仍然在您的性能要求范围内运行,请不要担心尝试优化它。而且你应该有一些更具体的性能要求,比如"我希望它尽可能快地运行":-(
请记住,效率并不总是意味着"无论成本如何,都尽可能快"。这意味着在不必牺牲其他东西(如可读性或可维护性(的情况下实现您的目标。
如果你采取一个完整的操作,让用户等待 0.1 秒,并将其优化到快十倍的程度,用户根本不会注意到这一点(我说"完成"是因为很明显,如果它被完成一万次而没有某种临时结果,用户会注意到差异(。
记住,测量,不要猜测!
- 编译时未启用intel oneApi CUDA支持
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用CMake检测支持的C++标准
- 为什么istream不支持右值提取
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 扩展光电二极管探测器以支持多个传感器
- MSVC是否支持C++11样式的属性而不是__declspec
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 错误:(-210:不支持的格式或格式组合)功能'create'中的硬件视频解码器不支持视频源
- 无穷大而循环时具有递归函数
- 哪个C++规范开始支持 std::vector
- 在C++中比较无穷大和无穷大
- 如何检测VS C++编译器是否支持C++11?
- CertGetCertificateChain 具有支持的内存存储和证书信任列表
- Casablanca/cpprestsdk listener.support接受函数,但不支持方法
- 将 IPv6 支持添加到雨量计
- 为什么C++不支持对未初始化变量进行智能分析?
- LMDB 是否支持随机读取?
- 如何在C++中有效地实现无穷大和负无穷大支持算术