为什么GCC在严格模式下不使用内置函数?

3

当在严格模式 -std=c... 下运行时,GCC禁用了许多内建函数

在非严格 ISO C 模式(-ansi、-std=c90、-std=c99 或 -std=c11)下,函数_exit、alloca、bcmp、bzero ... stpcpy 等函数可能被视为内建函数。所有这些函数都有对应的版本,以_builtin为前缀,即使在严格的C90模式下,也可以使用它们。

这是有原因的吗?这些内建函数不符合标准吗?还是因为标准规定当调用memcpy时应该实际调用它,不能进行优化?

如果我使用-std=gnu*重新编译代码,那么我的代码肯定可以更快地运行,因为它会启用一些优化

GCC通常会生成特殊代码来更高效地处理某些内建函数;例如,对alloca的调用可能成为直接调整堆栈的单个指令,对memcpy的调用可能成为内联复制循环

1个回答

5

_exitallocabcmpbzerostpcpy和列表中的其他函数在C标准中未定义,因此遵循C编译器不应该定义它们;这些名称必须对用户可用作其自己的标识符。

请注意,在严格的ISO模式下仍然启用许多其他内置函数。例如,memcpy 被“认为是内置函数,除非指定了 -fno-builtin”。


哎呀,你说得对。我想我读文档的速度太快了,把函数列表搞混了。但是你的解释仍然正确。谢谢。 - Benoît

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接