目前遇到的优化问题
-
字符串常量的合并
-
相同代码块中重复计算的合并
-
优化产生 bug 的问题示例
internal compiler error: in gsi_insert_seq_nodes_after, at gimple-iterator.c
- 段被删除,链接时报错,更甚者直接链接到了一个错误的地址
优化问题产生时的解决步骤
是否真的造成了问题
以结果来判定,对于上面提到的优化问题的第 2 点,虽然重复计算被合并,计算时间打印输出为 0,但是结果是正确的,所以这个现象就是正常的。
阻止编译器优化的方式
阻止一段区间内的代码优化
#pragma GCC push_options
#pragma GCC optimize ("O0")
code
#pragma GCC pop_options
上面的代码使用了 gcc 的特殊语法。第一个 pragma 将当前的编译选项入栈保存现场,第二个 pragma 重新设定优化参数为 O0,表示不进行任何优化。中间的内容就放你想要阻止优化的代码,最后一个 pragma 将之前保存的编译选项出栈,恢复现场。
阻止单个函数的优化
使用 attribute((optimize(“O0”))) 来完成。
使用示例:
void __attribute__((optimize("O0"))) test(void) {
code
}
更详细的信息请访问——how to prevent gcc optimizeing some statements in c。