虚函数最好不要内联

虚函数最好不要内联

现象

在这里插入图片描述

定义在内联函数时会有如下警告:

警告:'Sp_counter’没有行外的虚方法定义;它的虚函数表将在每个翻译单元中发出,意思就是程序编译时候会给每个有虚函数的类生成一个虚函数表然后放在.o里,程序运行后拷贝到内存里。

放在类外之后就正常了
在这里插入图片描述

原因

类的实例化就是给每一个实例在内存中分配一块地址。空类的大小是0,实例化时编译器会给一个字节。

class A {
  public:
    virtual ~A();
};
A::~A() {}

class AA {
  public:
    ~AA() {}
};
int main() {
    std::cout << sizeof(A) << ", " << sizeof(AA) << std::endl;
    // 结果 8, 1 (gcc 64)
}

如果类中有虚函数,多8个字节(gcc 64)。任何有虚函数的类,都会多一个地址的大小,存放虚函数表的位置。为了高效,这个放地址的位置在这个类的存储空间最前面。

每一个有虚函数的类都有一个虚函数表,这个类的所有对象都放着这个表的指针。程序编译时候会给每个有虚函数的类生成一个虚函数表放在.o里,程序运行后拷贝到内存里。**

如果一个类是在头文件中定义的,并且有虚函数表(它有虚方法,或者它从有虚方法的类派生),那么它必须在类中至少有一个行外的虚方法。如果不这样做,编译器就会把vtable和RTTI复制到每一个包含了#include头文件的.o文件中,这会使.o文件的大小膨胀,并增加链接时间

  1. 参考文章1
  2. 参考文章2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

-西门吹雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值