【问题标题】:C++ Templates: Inlined code and Compiler OptimzationsC++ 模板:内联代码和编译器优化
【发布时间】: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


【解决方案1】:

是的,应该始终优化。

即使不是,我也感觉std::cos 的成本会大大超过有条件的成本。

如果由于某种原因它没有被优化,使用模板特化在编译时强制分支。

【讨论】:

  • @MatthewHoggan 我不擅长阅读汇编,尤其是在深夜。您是否将其与具有单独功能且没有分支的版本进行了比较?
  • 不,我的工作还没有推进,但我希望明天再谈。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-11
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 2016-12-09
相关资源
最近更新 更多