影响gcc中的功能克隆/复制/恒定传播

Gio*_*hal 5 c optimization gcc compiler-flags

gcc使用optimizations-on 运行时,它会在认为函数处于热路径或传播到函数参数的常量时克隆(复制)C函数.

更具体地说,这似乎是由fipa-cp-clone选项控制的.

有没有办法影响这个?比如使用某个属性标记一个参数,作为编译时常量(就像你可以在带有模板参数的C++中那样),这将导致函数被克隆?

R..*_*R.. 5

重要的是是否使用常量参数调用函数(实际的常量表达式,或者编译器通过常量传播确定为常量的东西)。在这种情况下,GCC 将克隆该函数,除非它确定这样做成本太高或收益太小;我不知道影响该指标的方法。请注意,除非您一次编译整个程序或使用链接时优化,否则常量传播仅发生在单个翻译单元(源文件)内,而且我不确定此时是否仍然可以进行克隆。

我最好的猜测是,如果在您期望克隆时没有发生克隆,则 GCC 永远不会看到调用函数的常量参数。即使您知道它将是常量,编译器也可能无法证明它是常量。