2013-03-15 98 views
5

当运行gcc并进行优化时,它会在C函数认为函数处于热路径或存在传播到函数参数的常量时克隆(复制)C函数。在gcc中影响函数的克隆/复制/常量传播

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

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

+0

除了我的回答,我想对这个问题发表评论,如果你发布了一个最低限度的例子,你希望GCC克隆这个函数,但它没有,我想你可以得到更好的答案。然后,答案可以解决导致它不被克隆的具体问题,而不必猜测可能发生的事情。 – 2013-03-16 03:07:25

回答

3

重要的是该函数是否使用常量参数调用(或者是实际的常量表达式,或者是由编译器通过常量传播确定为常量)。在这种情况下,GCC会克隆该功能,除非它确定这样做会花费太多或者收益太少;我不知道影响该指标的方法。请注意,除非您一次编译整个程序或使用链接时优化,否则只有在单个翻译单元(源文件)中才会发生持续传播,而且我不确定克隆是否仍然可以在此时发生。

我最好的猜测,如果克隆没有发生,当你期望它应该,是GCC永远不会看到一个常量参数的函数被调用。即使你知道它会不变,编译器可能无法证明它是。

+0

谢谢,你能详细说一下吗?如何找出函数未被克隆的时间,我可以断言它是? – 2013-03-19 14:42:25