类定义中定义的成员函数是否与C+中其他地方定义的成员函数不同+;? 类定义中定义的成员函数与C++中定义的成员函数不同吗?例如,考虑下面的Fo.H.P/P> #pragma once struct foo { void bar() {} void buz(); };

类定义中定义的成员函数是否与C+中其他地方定义的成员函数不同+;? 类定义中定义的成员函数与C++中定义的成员函数不同吗?例如,考虑下面的Fo.H.P/P> #pragma once struct foo { void bar() {} void buz(); };,c++,C++,和foo.cpp #include "foo.h" void foo::buz() {}; 如果我们看看foo.o的符号 $ g++ -c foo.cpp $ nm -a foo.o 0000000000000000 b .bss 0000000000000000 n .comment 0000000000000000 d .data 0000000000000000 r .eh_frame 0000000000000000 a foo.cpp 0000000000000000 n .not

和foo.cpp

#include "foo.h"
void foo::buz() {};
如果我们看看foo.o的符号

$ g++ -c foo.cpp

$ nm -a foo.o
0000000000000000 b .bss
0000000000000000 n .comment
0000000000000000 d .data
0000000000000000 r .eh_frame
0000000000000000 a foo.cpp
0000000000000000 n .note.GNU-stack
0000000000000000 t .text
0000000000000000 T _ZN3foo3buzEv

$ c++filt _ZN3foo3buzEv
foo::buz()

我们看到只有一个符号表示
foo::buz
。现在,假设我们编译了多个包含
foo.h
的文件,然后根据结果创建一个库。成员函数
bar
buz
处理是否不同?

是的,存在差异。如果一个成员函数是在类定义中定义的,那么编译器会尝试使其成为内联函数。对于您的示例,该函数非常简单,可以使其内联。因此,编译器将
bar
内联,您只看到
baz
的符号

它的好坏很大程度上取决于具体的功能和您的用例。内联函数不需要实际的函数调用,因此性能有所提高。但缺点是,如果在许多地方包含类头,则会增加二进制大小

还要注意,内联是对编译器的请求。编译器可以随意忽略该请求,并将其视为普通方法。

如:

成员函数可以在其类定义中定义,在这种情况下,它是一个内联成员函数

另一方面,来自:

内联成员函数(无论是静态的还是非静态的)也可以在其类定义之外定义,前提是其在类定义中的声明或其在类定义之外的定义将该函数声明为内联或constexpr

问题是:在类定义中定义的成员函数与C++中定义的其他成员函数不同吗?

这主要取决于你如何定义它们,你可以从上面的引文中推断出来。

在您的示例中,它们实际上是不同的。

再次尝试编译相同的内容,但要使用内联成员函数。内联成员函数也可能导致不必要的重新编译。任何包含头文件的任何东西都需要在任何编辑上重新编译,而如果更改位于C++源文件中,则只有该文件需要重新编译(并且使用它的所有链接都重新链接,这并不昂贵)。