【问题标题】:Will a template bool be optimized out by the compiler?编译器会优化模板布尔值吗?
【发布时间】:2014-04-16 14:29:45
【问题描述】:

我有一个链表类,并且我刚刚编写了一组函数以使其与基于范围的 for 一起使用。为了对正向迭代器(例如使用 begin() 获得)与反向迭代器(例如使用 rbegin() 获得)使用相同的类模板,我在模板参数中添加了一个 bool。在递增或递减期间,会检查一次布尔值。它会被编译器优化掉还是会在运行时进行检查?

template< typename TYPE >
template< typename LINKTYPE, typename LINK, const bool REVERSE >
LinkList<TYPE>::IteratorBase<LINKTYPE, LINK, REVERSE> LinkList<TYPE>::IteratorBase<LINKTYPE, LINK, REVERSE>::operator++( int ) {
    Link<TYPE> *old = cur;

    if ( cur ) {
        cur = REVERSE ? cur->GetPrevious() : cur->GetNext();
        return old;
    }

    cur = nullptr;
    return old;
}

这里是更完整的代码摘录:http://pastebin.com/vv7Wgm9T

【问题讨论】:

  • 取决于编译器,但可能。如果你真的担心它,你应该专攻它,而不是像现在这样使用它。
  • 我想专攻,但在我的研究中,我发现如果不专攻整个类,就无法部分专攻方法。我不想吃一堆copypasta。
  • 我解决这个问题的方法是继承,孩子是专门的,但这也是我开始认为我的设计太复杂的时候。老实说,如果您的代码最终太慢,我只会担心它。您可以自己查看程序集,看看您的编译器和设置是否消除了条件。
  • 即使检查发生在运行时,由于分支预测,它可能真的很快。你应该测量它。
  • 虽然我很欣赏'standardese',但人们不得不说这不能保证被优化 - 它是一个模板参数,即编译时常量,所以任何编译器都没有'在非调试设置下立即优化它是不值得的。

标签: c++ templates


【解决方案1】:

C++ 标准中没有关于何时执行此类优化的任何内容,因此它是严格特定于编译器的。因此,唯一确定的方法是查阅编译器的文档或编译代码并查看反汇编。它很可能会被优化掉,但不能保证这种行为。

【讨论】:

  • 特别是,无论任何优化,都必须解析代码。那里不能有错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-11
  • 2017-04-24
相关资源
最近更新 更多