我应该在 body 还是 header 中定义 C++ 空函数?

Should I define c++ empty function in a body or a header?

据我所知,函数被包含在 .cc 中以避免重复它们,因为 headers 在不同的地方多次被包含。 不清楚 body 为空的函数是否会发生这种开销。 这种功能的例子可以是虚拟析构函数。

如果您引用自由函数,您应该:

  1. 将它们标记为内联
  2. 将它们标记为静态
  3. 将它们放在匿名命名空间中

请注意,在 #2 和 #3 中,函数在每个翻译单元中都是重复的(每次包含它时都会重复相同的代码)

如果您谈论的是 class 的成员函数(默认情况下内联提示,尽管有些人喜欢将其明确化,尽管这 只是一个提示 ) AFAIK 他们有外部链接,所以你可以确定你不会有两次相同的函数定义。简而言之,还可以。

相关:Are C++ class methods defined in the header always inlined?

出于以下几个原因,函数在单独的翻译单元中定义:

  • 该函数只需要在一个翻译单元中编译,而不是在所有使用它的翻译单元中编译†。我想这就是您提到的 开销
  • 分离可以用来避免复杂函数之间的循环依赖。
  • 修改单个翻译单元中的函数不会导致其他翻译单元重新编译。

如果您在所有使用它的翻译单元中定义该函数,通过定义它 inline,那么††优化器可以用内联扩展替换对该函数的调用。当函数简单并且经常从几个地方调用时,这是最可取的。

空函数对于内联扩展来说足够简单,因此将它定义为内联通常是有利的。它也不能有需要避免的有问题的依赖关系。如果适用的话,多次编译它的开销也可以忽略不计。如果您知道它将保持为空,那么它就不会被更改,因此不会导致大量重新编译。

总而言之,内联定义一个空函数是更可取的。除非你知道它稍后会被修改,并且希望在发生这种情况时避免重新编译。

† 如果同时编译多个翻译单元,智能编译器可以通过重用已编译的内联函数来优化编译,从而消除这种开销。

†† 如果从定义它的同一个翻译单元调用非内联函数,那么它也可以内联扩展。即使调用在另一个翻译单元中,如果同时编译翻译单元,也可以进行内联优化。即使没有,link 时间优化也可以允许跨翻译单元内联。请注意,virtual 函数不能内联扩展,除非可以在编译时推断出对象的运行时类型。