编译器会优化模板布尔值吗?

Posted

技术标签:

【中文标题】编译器会优化模板布尔值吗?【英文标题】: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',但人们不得不说这不能保证被优化 - 它是一个模板参数,即编译时常量,所以任何编译器都没有'在非调试设置下立即优化它是不值得的。 【参考方案1】:

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

【讨论】:

特别是,无论任何优化,都必须解析代码。那里不能有错误。

以上是关于编译器会优化模板布尔值吗?的主要内容,如果未能解决你的问题,请参考以下文章

模板参数作为函数说明符和编译器优化

typeof摇树优化js预编译

检查布尔模板参数时摆脱“条件表达式为常数”警告的方法?

Microsoft c++ 优化编译器已停止工作

Constexpr变量不是编译时间值吗?

vue2源码-- 模板编译阶段