C++基础系列题目(1)——sizeof

本文围绕C++类型的sizeof大小展开。探讨了空类型、含构造和析构函数的类型以及析构为虚函数的类型的sizeof值。指出空类型和含非虚成员函数类型实例大小为1B,含虚函数时会生成虚函数表和安插指针,64位系统指针占8字节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系列文章目录

C++基础系列题目(2)——多态的测试


1.定义一个空类型,里面没有任何成员变量和成员函数,对该类型求sizeof,大小是多少?

答:1

code

class A
{
};

int main(){
    A a;
    std::cout << sizeof(a) << endl;
    return 0;
}

output

1

解析

原本应该是0,但声明类型实例时,必须在内存中占有一定空间大小,否则无法使用。具体占多少取决于编译器。VS中每个空类型的实例占用1B。

2.如果该类型中定义一个构造函数和析构函数,求sizeof大小

答:1

code

class A
{
public:
    A(){};
    ~A(){};
    void foo(){};  //不止是构造和析构,任何非虚函数都一样
};

int main(){
    A a;
    std::cout << sizeof(a) << endl;
    return 0;
}

output

1

解析

对于非虚成员函数,调用时只需要知道函数地址即可,这些函数地址只与类型相关,与类型无关,编译器不会在实例内添加额外信息。

3.如果将析构定义成虚函数呢?

答:8

code

class A
{
public:
    A(){};
    virtual ~A(){};
    void foo(){};  //不止是构造和析构,任何非虚函数都一样
};

int main(){
    A a;
    std::cout << sizeof(a) << endl;
    return 0;
}

output

8

解析

编译器一旦发现虚成员函数 ,会进行下面两个操作:

  1. 生成一个虚函数表(virtual table, vtbl),该表中存放一堆指向虚函数的指针。类所关联的type_info object(支持runtime type identification, RTTI)通常发在虚函数表的第一个槽内。
  2. 类对象被安插一个指针(vptr),指向相关的虚函数表。

而一个指针类型,在64位系统占8字节,32位系统中占4字节。


总结

以上内容改自《剑指offer》。
下面针对对象类型进行描述,看完下面内容,上面的3个问题就会豁然开朗。(参考《深度探索C++对象模型》)

首先我们定义这样一个类:

class Point{
public:
    Point(float xval);
    virtual ~Point();

    float x() const;
    static int PointCount();

protected:
    virtual ostream& print(ostream &os) const;

    float _x;
    static int _point_count;
};

该类具有:

  • 2个虚函数(析构 + print);
  • 1个静态成员函数(PointCount);
  • 2个非静态成员函数(构造函数 + x(),构造函数不能是虚函数)
  • 1个非静态成员变量
  • 1个静态成员变量

对于成员变量:

  • 非静态成员变量置于类对象之内;
  • 静态成员变量置于类对象之外;

对于成员函数:

  • 静态和非静态成员函数都置于类对象之外;
  • 虚成员函数则采用下面两个步骤处理:
  1. 生成一个虚函数表(virtual table, vtbl),该表中存放一堆指向虚函数的指针。类所关联的type_info object(支持runtime type identification, RTTI)通常发在虚函数表的第一个槽内。
  2. 类对象被安插一个指针(vptr),指向相关的虚函数表。

用下图说明上面问题
在这里插入图片描述
上面这张图一目了然地说明了前面的三个问题。理解该图就理解了前面三个问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

MOLWH

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

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

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

打赏作者

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

抵扣说明:

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

余额充值