我总是忘记在我的变量和函数中添加'static'前缀,因此GCC将它们标记为extern。是否可以更改此行为,以便默认情况下将所有内容标记为静态。这两种类型在运行时是否存在性能差异,还是更正式?
答案 0 :(得分:5)
是否可以更改此行为,以便默认情况下将所有内容标记为静态。
据我所知。
这两种类型在运行时是否存在性能差异,还是更正式?
是的,gcc
能够在指定了static
的对象或函数时执行进一步的优化。例如,gcc
(即使在-O0
中)将内联static
指定的只调用一次的函数。
答案 1 :(得分:1)
首先:extern
修饰符不是默认值。该限定符表示所提及的项目将在另一个编译单元中定义,因此它仅适用于声明全局变量之类的内容。
无法使static
修饰符设为默认值,因为没有dynamic
修饰符会取消此默认值。因此,没有办法编写具有该默认值的工作代码:每个函数和变量都是static
,这将导致编译器生成空输出文件!
这两种类型在运行时是否存在性能差异,还是更正式?
编译器可以对static
函数和变量执行一些优化,这些函数和变量不能在动态函数上执行。特别是,static
函数和从未引用的变量可能会被完全删除,static
函数可以更积极地内联。