【发布时间】:2013-06-15 06:24:31
【问题描述】:
假设以下代码在被编译器优化和内联时会删除评估三元运算所需的分支,是否安全?或者对于大多数主流编译器,将下面的方法分成两个单独的方法以避免分支会更明智?
/*! \brief this method returns the cos of an angle. User can specify if it is
* in degrees or radians.
*/
template <typename T, angle_mode AM>
T cos(const T &angle)
{
return (AM == radians) ?
std::cos(angle) :
std::cos(degrees_to_radians(angle));
}
【问题讨论】:
-
这确实取决于您如何使用它。只有当 AM 是一个常数时,优化才会起作用。如果 AM 是一个变量,则无法优化任何内容。
-
您的反汇编似乎与问题无关。您的第一个 sn-p 是
degrees_to_radians()(它没有比较,但确实调用了另一个函数),您的第二个 sn-p 是main,您提到的分支似乎是glext2pi()的内联版本的一部分。您对AM的测试早已不复存在。
标签: c++ templates compiler-optimization