首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++使用模板来避免编译器检查布尔值

C++使用模板来避免编译器检查布尔值
EN

Stack Overflow用户
提问于 2012-08-20 06:28:37
回答 2查看 5.6K关注 0票数 21

假设我有一个函数:

template <bool stuff>
inline void doSomething() {
    if(stuff) {
        cout << "Hello" << endl;
    }
    else {
        cout << "Goodbye" << endl;
    }
}

我这样称呼它:

doSomething<true>();
doSomething<false>();

它会弹出:

Hello
Goodbye

我真正想知道的是,编译器是否完全优化了这一点?当我使用true调用模板化函数时,它是否会创建一个只输出"Hello“的函数,并避免if语句和"Goodbye”代码?

对于我刚刚写的这个巨大的函数来说,这将是非常有用的,它应该是非常优化的,并且尽可能避免不必要的if语句检查。我有一种非常好的感觉,如果不是在没有优化的调试版本中,至少在带有优化的发布版本中是这样的。

EN

回答 2

Stack Overflow用户

发布于 2012-08-20 06:40:29

这本质上取决于编译器,因此您必须检查编译器的文档或生成的代码。但在这种简单的情况下,您可以很容易地自己实现优化:

template <bool stuff>
inline void doSomething();

template<>
inline void doSomething<true>() {
    cout << "Hello" << endl;
}

template<>
inline void doSomething<false>() {
    cout << "Goodbye" << endl;
}

但是“优化”这个词并不合适,因为这实际上可能会降低性能。只有在对代码性能有实际好处的情况下,它才是优化。

票数 3
EN

Stack Overflow用户

发布于 2012-08-20 06:37:25

如果我理解正确的话,您希望(本质上)以'two‘函数结束,这些函数针对true或false输入进行了优化,这样它们就不需要检查该标志了?

除了可能产生的任何微不足道的优化(我反对过早的优化-我相信在测量之前优化之前的可维护性),我会说为什么不把你的函数重构成两个函数呢?如果它们有共同的代码,那么这些代码也可以重构出来。然而,如果需求是重构不是最优的,那么我会用#define重构来代替它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12030497

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档