tot*_*ing 9 c++ gcc c++-standard-library c++11
在C++ 03中,使用eg std::pow(double_val, 6)
比使用快得多std::pow(double_val, 6.0)
.
在使用C++ 11进行编译时不再是这种情况.从gcc的libstdc ++ - 4.8查看cmath头文件,可以看到显式的pow(double,int)不再存在,这种情况由以下模板处理,该模板将int提升为double:
template<typename _Tp, typename _Up>
inline typename __gnu_cxx::__promote_2<_Tp, _Up>::__type
pow(_Tp __x, _Up __y) {
typedef typename __gnu_cxx::__promote_2<_Tp, _Up>::__type __type;
return std::pow(__type(__x), __type(__y));
}
Run Code Online (Sandbox Code Playgroud)
这种行为是在C++ 11标准中还是未来的libstdc ++实现可以返回到更快的方法?
其次,如果出于标准或实施原因,更快的行为不再可能,那么再次实现它的最便携方式是什么?我power(...)
在"ext/numeric"下的gcc stdlibc ++中看到了一个函数,但这被标记为非标准的 SGI(rip)扩展.
首先,是的,这种行为与 C++11 标准一致(尽管与 C++03 不一致),该标准在第 26.8 节第 11 段中表示:
此外,应有足够的额外过载以确保:
如果与 double 形参对应的任何实参的类型为 long double,则与 double 形参对应的所有实参都将有效地转换为 long double。
否则,如果与 double 形参对应的任何实参具有 double 类型或整数类型,则与 double 形参对应的所有实参都将有效地转换为 double。
否则,与双参数相对应的所有参数都将有效地转换为浮点型。
(除了float
-only、double
-only 和long double
-only 的重载之外。)
因此,实现实际上必须将该整数参数转换为 adouble
并且我不认为合格的库有可能为std::pow
整数幂提供更快的速度,除了可能检查double
参数的完整性(这是一个词吗?)和在这种情况下使用特殊路径。
为了提供一种独立于平台的更快的方法,我想到的唯一一件事就是编写一个自定义包装器,将其委托给这个非标准(power
如果存在)。除此之外,我不知道如何std::pow
在不编写自己的实现的情况下再次注入该行为。
编辑:然而,当查看这个答案时,实现确实有可能仍然为整数幂提供优化的重载,只要它的行为与std::pow(double(x), double(y))
. 因此,实现有可能提供更快的版本,但我不会像您在 C++03 中所做的那样太依赖这一点(恕我直言,它甚至是标准的一部分,但我可能是错的) 。
归档时间: |
|
查看次数: |
1436 次 |
最近记录: |