现代编译器会自动优化以下C++代码吗
Will a modern compiler automatically optimize the following C++ code?
如果我使用以下代码,编译器会像开关结构一样优化它吗?开关结构使用二进制树来搜索值?
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
变量的值在末尾应该是0
。b++
部分不会执行。这是预期的行为,但根据编译器及其优化设置,可能会有一些异常。甚至许多像CCD_ 11这样的脚本语言都是这样的。
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 在c代码之间共享数据的最佳方式
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值