类定义中定义的成员函数是否与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
的文件,然后从结果中创建一个库。成员函数bar
和buz
的处理方式不同吗?
答案 0 :(得分:2)
是的,有区别。如果在类定义中定义了成员函数,则编译器会尝试使其成为内联函数。对于您的示例,该函数非常简单,可以使其内联。因此编译器使bar
内联,您只看到baz
的符号。
它的好坏在很大程度上取决于具体的功能和用例。内联函数不需要实际的函数调用,那里有性能改进。但缺点是如果在许多地方包含类标题,那么这将增加二进制文件大小。
另请注意,inline是对编译器的请求。编译器可以自由地忽略该请求并将其视为常规方法。
答案 1 :(得分:1)