我有一个类,它有很多小函数。说到小函数,我指的是那些不做任何处理而只返回一个文字值的函数。类似于:
string Foo::method() const{
return "A";
}
我已经创建了一个头文件"Foo.h“和源文件"Foo.cpp”。但由于该函数非常小,我正在考虑将其放入头文件本身。我有以下问题:
发布于 2009-01-17 14:44:05
如果函数很小(您经常更改它的可能性很低),并且如果函数可以放入标头而不包含大量其他标头(因为您的函数依赖于它们),那么这样做是完全有效的。如果您将它们声明为外部内联,则编译器需要为每个编译单元提供相同的地址:
headera.h
inline string method() {
return something;
}
如果成员函数是在其类中定义的,则它们是隐式内联函数。同样的事情也适用于它们:如果它们可以毫不费力地放入头部,那么您确实可以这样做。
因为函数的代码被放在头中并且是可见的,所以编译器能够内联对它们的调用,也就是说,将函数的代码直接放在调用位置(不是因为你在它之前放了内联,而是更多的是因为编译器决定这样做。只使用内联是对编译器的一个提示)。这可以提高性能,因为编译器现在可以看到参数与函数本地变量匹配的地方,以及参数不会相互混淆的地方-最后但并非最不重要的是,不再需要函数帧分配。
我的理解是,当编译完成时,编译器将展开头文件并将其放在包含它的地方。对吗?
是的,这是正确的。该函数将在包含其标头的每个位置定义。编译器只关心将它的一个实例放入结果程序中,而不是删除其他实例。
发布于 2009-01-17 15:18:42
根据您的编译器及其设置,它可能会执行以下任一操作:
在许多情况下,编译器可以比您更好地确定函数是否应该内联,因此没有必要事后再猜测它。当一个类有许多小函数时,我喜欢使用隐式内联,因为在类中有实现是很方便的。对于较大的函数,这并不能很好地工作。
另一件要记住的事情是,如果你要导出一个DLL/共享库中的类( IMHO不是一个好主意,但人们无论如何都会这么做),你需要非常小心地使用内联函数。如果构建DLL的编译器决定应该内联一个函数,那么您就有两个潜在的问题:
发布于 2009-01-17 14:41:15
性能将会提高,因为头文件中的实现是隐式内联的。正如你提到的,你的函数很小,内联操作对你很有好处。
你所说的编译器,除了头文件或.cpp
文件中的代码之间的内联之外,true.There对于编译器来说也没有区别。
https://stackoverflow.com/questions/453372
复制相似问题