0. gcc -o
gcc -o 的优化仍然是机械的,想当然的。只有做到深入理解计算机系统,加深对编程语言的理解,才能写出最优化的代码。
Linux下gcc 优化级别的介绍
· gcc -o0 ⇒ 不提供任何优化;
· gcc -o1 ⇒ 最基本的优化,主要对代码的分支、表达式、html" target="_blank">常量等进行优化,编译器会在较短的时间下将代码变得更加短小,这样体积就会变得更小,会减少内存的占用率,在操作系统进行内存调度时就会更快。
· 但是事情没有绝对的优点,当一个庞大的程序被拆碎细分的话,内存占用会大大增加,由于当今系统大多数都是多线程,就会出现卡顿和反应延迟。
· 大的项目代码不适合 gcc -o1 优化;
· gcc -o2:是对 o1 的进阶,在 o1 在基础上会进行更严格的划分,最重要的是加入了寄存器的实用;
1. volatile 关键字
volatile 关键字能够阻止编译器的过度优化,可以做到如下两件事情:
· 阻止编译器为了提高速度将一个变量缓存到寄存器而不写回;
· 阻止编译器调整操作 volatile 变量的指令顺序;
2. register 关键字
将代码放在寄存器的方式是使用 register 修饰变量,适用于频繁调用的变量。
总结
以上就是本文关于C/C++ 编译器优化介绍的全部内容,希望对大家有所帮助。欢迎各位参阅本站其他相关专题,有什么问题可以随时给我们留言,小编会及时回复大家的。
我经常遇到这种情况。乍一看,我认为,“这是糟糕的编码;我正在执行一个方法两次,必然会得到相同的结果。”但想到这里,我不得不怀疑编译器是否像我一样聪明,并能得出相同的结论。 编译器的行为是否取决于 方法的内容?假设它看起来像这样(有点类似于我现在的真实代码): 除非对这些对象来自的任何存储进行处理不当的异步更改,否则如果连续运行两次,肯定会返回相同的内容。但是,如果它看起来像这样(为了论证而无意义的
本文向大家介绍C#中尾递归的使用、优化及编译器优化,包括了C#中尾递归的使用、优化及编译器优化的使用技巧和注意事项,需要的朋友参考一下 递归运用 一个函数直接或间接的调用自身,这个函数即可叫做递归函数。 递归主要功能是把问题转换成较小规模的子问题,以子问题的解去逐渐逼近最终结果。 递归最重要的是边界条件,这个边界是整个递归的终止条件。 上面是个经典阶乘函数的实现。这里分2步: 1.转换,把10的阶
我在godbolt上编译这段代码。orgwith-O2和编译器不会使用一些memcpy对其进行优化,而是诚实地运行循环。 但是,如果我将“= src[i]”替换为“= 0”,他们会使用memset。但同样,当我用“ = 1”替换它时,它们会运行一个循环。当要设置的值不为零时,为什么它们会避免使用 memcpy 和 memset?我认为这是他们将执行的第一批优化之一。
问题内容: 假设我在C代码中有类似的内容。我知道您可以使用a 代替,以使编译器不对其进行编译,但是出于好奇,我问编译器是否也可以解决此问题。 我认为这对于Java编译器来说更为重要,因为它不支持。 问题答案: 在Java中,if内的代码甚至都不是已编译代码的一部分。它必须编译,但不会写入已编译的字节码。它实际上取决于编译器,但我不知道没有对它进行优化的编译器。规则在JLS中定义: 优化的编译器可能
如果关闭了编译器优化(gcc-o0...),那么说'volatile'关键字没有区别是可以的吗? 我制作了一些示例“C”程序,并且仅当打开编译器优化时,才在生成的汇编代码中看到易失性和非易失性之间的区别,即((gcc-o1....)。
我编译了以下C代码: 使用命令 .下面是输出中的 Bar 函数: 我有几个关于这个汇编代码的问题: > 如果函数体中既没有使用也没有使用rsp,那么"",""和""的目的是什么? 为什么和自动包含C函数的参数(分别为和)而不从堆栈中读取它们? 我尝试将Foo的大小增加到88字节(11s),指令变成了。将我的结构设计为“圆形”大小以避免乘法指令(以优化数组访问)是否有意义?指令被替换为: