5

gcc使用优化运行时,当它认为函数位于热路径中或有常量传播到函数参数时,它会克隆(复制)C 函数。

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

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

4

1 回答 1

6

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

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

于 2013-03-15T18:56:45.903 回答