2010-03-05 99 views
5

我知道编译器可能执行或不执行函数的内联扩展,无论程序员是否请求。
我只是好奇地想知道,有没有什么方法可以让程序员知道编译器已经内联了一个特定的函数?内联函数

+2

更合适的问题,有没有什么方法可以让程序员确信编译器已经内联了一个特定的函数* call *? – Potatoswatter 2010-03-05 04:45:19

回答

10

除了通过查看生成的代码,没有。有些实现可能会提供这些信息,但这不是标准所要求的。

之类的东西inlineregister(颤栗)是建议编译器,它是免费接受他们,不理会他们,甚至对你撒谎,它的完成它,而你背后偷偷去和没有这样做:-)

我倾向于不使用这样的功能,因为我怀疑编译器通常比我知道如何从我的代码中获得最高性能。

0

阅读目标文件的反汇编。

1

设置您的编译器以生成汇编代码并在那里检查。

+0

如果你有不同的debug v release版本标志,请确保使用后者。我已经看到一些编译器从不内联,除非您至少启用了一些优化。 – 2010-03-05 05:57:39

2

您可以分析您的代码,并查看感兴趣的功能是否显示在调用堆栈中。尽管如此,我想不能保证您的堆栈采样率是否不够高。

但它可能证明它内联:如果你知道A电话B,这就要求CA永远不会调用C直接,如果你看到A调用堆栈上调用C,你知道B是内联该调用。

0

除了查看输出汇编程序之外,没有办法知道。

这些日子的编译器是'聪明的',他们决定内联什么函数以及在什么情况下。

就像register关键字一样,编译器这几天都在挑选,而且真的忽略了你的请求。

0

我不认为有一种方法来找出你想要什么,

但是你可以增加功能的possibilites被内联函数,

使得函数的定义可见到它被调用的翻译单元。即你总是必须将头文件中的内联函数的定义。