首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C++中编写头文件中的函数定义

在C++中编写头文件中的函数定义
EN

Stack Overflow用户
提问于 2009-01-17 14:36:22
回答 7查看 103.4K关注 0票数 65

我有一个类,它有很多小函数。说到小函数,我指的是那些不做任何处理而只返回一个文字值的函数。类似于:

代码语言:javascript
复制
string Foo::method() const{
    return "A";
}

我已经创建了一个头文件"Foo.h“和源文件"Foo.cpp”。但由于该函数非常小,我正在考虑将其放入头文件本身。我有以下问题:

  1. 如果我将这些函数定义放在头文件中,是否会出现性能或其他问题?我会有很多这样的函数,
  2. 我的理解是,当编译完成后,编译器会展开头文件,并将其放在包含它的地方。对吗?
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-01-17 14:44:05

如果函数很小(您经常更改它的可能性很低),并且如果函数可以放入标头而不包含大量其他标头(因为您的函数依赖于它们),那么这样做是完全有效的。如果您将它们声明为外部内联,则编译器需要为每个编译单元提供相同的地址:

headera.h

代码语言:javascript
复制
inline string method() {
    return something;
}

如果成员函数是在其类中定义的,则它们是隐式内联函数。同样的事情也适用于它们:如果它们可以毫不费力地放入头部,那么您确实可以这样做。

因为函数的代码被放在头中并且是可见的,所以编译器能够内联对它们的调用,也就是说,将函数的代码直接放在调用位置(不是因为你在它之前放了内联,而是更多的是因为编译器决定这样做。只使用内联是对编译器的一个提示)。这可以提高性能,因为编译器现在可以看到参数与函数本地变量匹配的地方,以及参数不会相互混淆的地方-最后但并非最不重要的是,不再需要函数帧分配。

我的理解是,当编译完成时,编译器将展开头文件并将其放在包含它的地方。对吗?

是的,这是正确的。该函数将在包含其标头的每个位置定义。编译器只关心将它的一个实例放入结果程序中,而不是删除其他实例。

票数 71
EN

Stack Overflow用户

发布于 2009-01-17 15:18:42

根据您的编译器及其设置,它可能会执行以下任一操作:

  • 它可以忽略inline关键字(它只是对编译器的一个提示,而不是一个命令),并生成独立的函数。如果你的函数超过了依赖于编译器的复杂度阈值,它可能会这样做。例如,太多的嵌套循环。
  • 它可能会决定你的独立函数是一个很好的内联扩展候选者。

在许多情况下,编译器可以比您更好地确定函数是否应该内联,因此没有必要事后再猜测它。当一个类有许多小函数时,我喜欢使用隐式内联,因为在类中有实现是很方便的。对于较大的函数,这并不能很好地工作。

另一件要记住的事情是,如果你要导出一个DLL/共享库中的类( IMHO不是一个好主意,但人们无论如何都会这么做),你需要非常小心地使用内联函数。如果构建DLL的编译器决定应该内联一个函数,那么您就有两个潜在的问题:

  1. 使用动态链接库生成程序的编译器可能会决定不内联函数,这样它将生成对不存在的函数的符号引用,并且不会加载动态链接库。
  2. 如果更新动态链接库并更改内联函数,客户端程序仍将使用该函数的旧版本,因为该函数已内联到客户端代码中。
票数 12
EN

Stack Overflow用户

发布于 2009-01-17 14:41:15

性能将会提高,因为头文件中的实现是隐式内联的。正如你提到的,你的函数很小,内联操作对你很有好处。

你所说的编译器,除了头文件或.cpp文件中的代码之间的内联之外,true.There对于编译器来说也没有区别。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/453372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档