2011-03-08 80 views
2

我已经搜索并且无法验证在.h文件中声明并且定义在.cpp文件中时GCC编译器如何处理内联getter和setter。在.h和.cpp文件中分隔定义和声明时,是否可以内联getter和setter?

大多数人似乎都说GCC无法看到这些源文件障碍,并且根本无法将这些内联内联,而其他人则不同意。我查看了文档,也找不到答案。我错过了吗?

我知道内联是由编译器做出的选择,并不总是有保证,但假设最佳情况,至少可以吗?

回答

5

(你的真正用意是什么要问的是哪里的定义是不同的.cpp文件到您当前正在编制一个情况,再后来在链接,编译器不关心.hpp.cpp, 。但对translation units

无论如何,在http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html,向下滚动到 “flno”:

这个选项运行标准的链接时优化。 GCC的前两个调用将把GIMPLE的字节码表示保存到foo.o和bar.o中的特殊ELF部分。最后的调用将读取foo.o和bar.o中的GIMPLE字节码,将这两个文件合并为一个内部图像,然后照常编译结果。由于foo.o和bar.o都合并为一个图像,因此这会导致GCC中的所有程序间分析和优化在两个文件中工作,就好像它们是单个文件一样。这意味着,例如,内联将能够将bar.o中的函数内联到foo.o中的函数中,反之亦然。

所以,是的,可以跨模块边界优化内联。

然而,C++仍然使得其要求:

内联函数应每翻译单元在其中使用它来限定。 [3.2/3,C++ 03]

所以其实你可能不会编写代码,如果你使用的inline关键字来利用这一点;你只能依赖链接器“只是决定”在适合的情况下内联你的函数。所以这不是一个可以让你移动代码的选项。

请记住,在你的代码中写入inline与函数实际上没有一对一的关系,实际上得到物理内联;这只是编译器(或链接器,如果你已经打开了上面提到的链接时优化)的暗示。

+0

是的,这就是我的意思。谢谢你的纠正。这是我似乎忽略的一个区别。 – Nathan 2011-03-08 16:43:29

+0

@Nathan:没问题 – 2011-03-08 16:47:16

0

1 /在内部声明的函数必须在所有使用它们的编译单元中定义

2 /假设参数是正确的,gcc总是能够内联函数,只要它看到定义,它们就不需要声明为内联。 (但是声明它们内联将有助于使定义在所有编译单元中可用,并且您可能需要更高级别的优化来内联未声明内联的函数。)

3 /最近版本的gcc有可能做链接时间优化。 IIRC,链接时可能的优化之一是内联。