当运行带有优化的gcc
时,它会在认为函数处于热路径或传播到函数参数的常量时克隆(复制)C函数。
更具体地说,这似乎是由fipa-cp-clone
选项控制的。
有没有办法影响这个?例如,使用某个属性标记一个参数,作为编译时常量(就像你可以在带有模板参数的C ++中那样),这将导致函数被克隆?
答案 0 :(得分:4)
重要的是是否使用常量参数调用函数(实际的常量表达式,或者编译器通过常量传播确定为常量的东西)。在这种情况下,GCC将克隆该功能,除非它确定这样做太昂贵或者利益太少;我不知道影响该指标的方法。请注意,常量传播仅在单个转换单元(源文件)中发生,除非您一次编译整个程序或使用链接时优化,并且我不确定克隆是否仍然可以在该点发生。
我最好的猜测,如果您希望克隆没有发生,那么GCC永远不会看到调用该函数的常量参数。即使您知道它将是常量,编译器也可能无法证明它是。