gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:15:28 24 4
gpt4 key购买 nike

类定义中定义的成员函数的编译方式是否与 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 的处理方式不同吗?

最佳答案

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

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

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

关于c++ - 类定义中定义的成员函数的编译方式是否与 C++ 中其他地方定义的成员函数不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37638870/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com