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