现代编译器会自动优化以下C++代码吗

Will a modern compiler automatically optimize the following C++ code?

本文关键字:C++ 代码 优化 编译器      更新时间:2023-10-16

如果我使用以下代码,编译器会像开关结构一样优化它吗?开关结构使用二进制树来搜索值?

   if ( X == "aaaa" || X == "bbbb" || X == "cccc" || X == "dddd" )
   {
   }
   else if ( X == "abcd" || X == "cdef" || X == "qqqq" )
   {
   }

这只是一个例子,报价符号内部没有什么模式

更新

好吧,X是一个字符串,但我真的不认为这很重要,我只想知道,当if中的所有内容都是关于单个变量时,它会被优化吗。

将逐个比较这些值,因为这是||或短路运算符的要求。因此,这里将发生两件事:

  • X将从右到左逐一进行比较
  • 在任何成功的比较之后都不会有更多的比较(因为是短路OR运算器),即在以下情况下

例如:

int hello() {
    std::cout<<"Hello";
    return 10;
}
int world() {
    std::cout<<"World";
    return 11;
}
int hello2() {
    std::cout<<"Hello2";
    return 9;
}
int a = 10;
bool dec = (a == hello() || a == world())
bool dec = (a == hello2() || a == hello() || a == world())

第一条语句的输出为:

Hello

因为a == world()将不被执行,而对于第二个Hello2 Hello,因为比较继续进行直到第一次成功。

&&运算符的情况下,比较会一直进行到第一次失败(因为这足以确定整个语句的结果)。

几乎可以肯定不是。二进制搜索需要某种排序关系,以及以低于的价格进行比较的能力。编译器不能假设这样的存在,即使它真的找到了,也不能假设它定义了一个等价关系,对应于==。编译器也可能无法确定定义排序关系的函数没有副作用。(如果有副作用,或者表达式中的任何操作都有副作用效果,编译器必须尊重的短路行为||.)最后,即使编译器完成了所有这些。。。如果我仔细选择比较的顺序,以便最频繁第一个案例。这样的";优化";甚至可能最终令人讨厌。

“正确";要处理此问题,需要创建一个映射指向函数(或多态函数对象,如果涉及某种状态)。

这可能取决于您设置的标志。二叉树搜索速度更快,但通常需要处理更多的代码。所以,如果你对尺寸进行了优化,它可能不会。我不确定它是否能做到。你知道,gcc是根据很多标志进行优化的。O1,O2,O3,O4只是简单的形式来表示大的旗帜组。您可以在此处找到所有优化标志的列表:http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

尝试在该页面中搜索字符串、二进制树等。

测试这一点的最佳方法是下面的示例。

int a = 0;
int b = 0;
if(a == a || b++) {
    ...
}
cout << b;

b变量的值在末尾应该是0b++部分不会执行。这是预期的行为,但根据编译器及其优化设置,可能会有一些异常。甚至许多像CCD_ 11这样的脚本语言都是这样的。