在类定义中定义的成员函数是否与在C ++中其他地方定义的成员函数的编译方式不同?

时间:2016-06-05 05:48:36

标签: c++

类定义中定义的成员函数是否与C ++中其他地方定义的成员函数的编译方式不同?例如,请考虑以下foo.h

#pragma once
struct foo {
    void bar() {}
    void buz();
};

和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的文件,然后从结果中创建一个库。成员函数barbuz的处理方式不同吗?

2 个答案:

答案 0 :(得分:2)

是的,有区别。如果在类定义中定义了成员函数,则编译器会尝试使其成为内联函数。对于您的示例,该函数非常简单,可以使其内联。因此编译器使bar内联,您只看到baz的符号。

它的好坏在很大程度上取决于具体的功能和用例。内联函数不需要实际的函数调用,那里有性能改进。但缺点是如果在许多地方包含类标题,那么这将增加二进制文件大小。

另请注意,inline是对编译器的请求。编译器可以自由地忽略该请求并将其视为常规方法。

答案 1 :(得分:1)

9.2.1/1开始:

  

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

另一方面,来自9.2.1/2

  

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

问题是:是否在类定义中定义的成员函数的编译方式与在C ++中其他地方定义的成员函数的编译方式不同?

主要取决于你如何定义它们,你可以从上面的引文中推断出来 在你的例子中,它们实际上是不同的。