[英]How to get the gcc compiler to not optimize a standard library function call like printf?
出于好奇,我想知道gcc是否可以通过某种方式不优化任何函数调用?
在生成的汇编代码中,printf函数由putchar代替。 即使使用默认的-O0
最小优化标志,也会发生这种情况。
#include <stdio.h>
int main(void) {
printf("a");
return 0;
}
( Godbolt显示GCC9正在执行此操作,clang8使其保持不变。)
使用-fno-builtin
可以禁用所有标准C函数的替换和内联操作。
或将-fno-builtin-FUNCNAME
用于特定功能,例如-fno-builtin-printf
。
默认情况下,某些常用的标准C函数被作为内置函数处理,类似于__builtin_popcount
。 printf的处理程序将其替换为putchar或puts(如果可能)。 https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html
默认情况下,不会将诸如printf("a")
类的C语句的实现细节视为可见的副作用,因此不会保留任何东西。 您仍然可以在调用站点上设置断点并进入函数(至少在asm或如果安装了调试符号的情况下,在源代码模式下)。
要为单个函数禁用其他类型的优化,请参见函数上的__attribute__((optimize(0)))
或#pragma GCC optimize
。 但要注意:
最
optimize
属性应仅用于调试目的。 它不适用于生产代码。
您不能禁用所有优化。 gcc通过内部表示形式转换为asm的方式中固有的一些优化。 请参阅禁用GCC中的所有优化选项 。
例如,即使在-O0
gcc也会将x / 10
优化为乘法逆。
它仍然将所有内容存储在C语句之间(用于一致调试; 这是-O0
真正含义 ); gcc没有尝试完全将C音译为asm的“完全哑”模式。 为此使用tcc
。 Clang和带有-O0
ICC比gcc的字面意义更大,MSVC调试模式也是如此。
请注意, -g
永远不会对代码生成产生任何影响,仅会对发出的元数据起作用。 GCC使用其他选项(主要是-O
, -f*
和-m*
)来控制代码生成,因此,除了较大的二进制文件外,您始终可以安全地启用-g
而不会影响性能。 这不是调试模式 (即-O0
),而仅仅是调试符号 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.