Use -fno-内置禁用标准 C 函数的所有替换和内联等价函数。 (这对于假设的代码的性能非常不利memcpy(x,y, 4)
将编译为仅未对齐/别名安全加载,而不是函数调用。并禁用恒定传播,例如strlen
字符串文字。所以通常在实际使用中你会希望避免这种情况。)
Or use -fno-builtin-FUNCNAME
对于特定功能,例如-fno-builtin-printf
.
默认情况下,一些常用的标准 C 函数被处理为内置函数,类似于__builtin_popcount
。 printf 的处理程序将其替换为 putchar 或 put
如果可能的话。
6.59 GCC提供的其他内置函数
C 语句的实现细节如下printf("a")
默认情况下,它们不被视为可见的副作用,因此它们不会被保留。您仍然可以在调用站点设置断点并单步执行函数(至少在汇编中,或者如果安装了调试符号,则在源代码模式下)。
要禁用单个函数的其他类型的优化,请参阅__attribute__((optimize(0)))在一个函数上 or #pragma GCC optimize
。但要注意:
The optimize
属性只能用于调试目的。它不适合生产代码。
你无法禁用all优化。一些优化是 GCC 在汇编过程中通过内部表示进行转换的方式所固有的。看禁用 GCC 中的所有优化选项.
例如,即使在-O0
,GCC将优化x / 10
为乘法逆元。
它仍然将 C 语句之间的所有内容存储到内存中(以实现一致的调试;就是这样-O0真正意思); GCC 没有“完全愚蠢”的模式,试图尽可能天真地将 C 音译为汇编语言。使用tcc
为了那个原因。Clang and ICC with -O0
比 GCC 更字面化,也是如此MSVC调试模式。
注意-g
从来没有any对代码生成的影响,仅对发出的元数据有影响。 GCC 使用其他选项(主要是-O
, -f*
, and -m*
)来控制代码生成,因此您始终可以安全地启用-g
除了更大的二进制文件之外,不会损害性能。这不是调试mode(那是-O0
);这只是调试symbols.