空类型的sizeof问题与C++对象模型

1.上次看了《剑指offer》,上面提到了空类型对象的sizeof问题,当时不太理解,就放在那里没管了,
最近看了《深度探索C++对象模型》,在发现C++的对象模型是怎么回事后恍然大悟,原来这么简单。

剑指offer第23页:
空类型的sizeof问题
第一问好理解,空类型的实例不含任何信息,但必须占有一定空间,vs编译器决定每个空类型占一个字节。
第二问和第三问就不太好理解了,也不好记。

.

2.下面我们利用一个class的定义来理解对象模型:
在C++中,有两种成员变量:static和nonstatic。有三种成员函数:static,nonstatic和virtual

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;    //静态成员变量
};

该类型的对象模型如下:
C++对象模型
如上图:Point类型的对象pt中只存放两个东西,一个是非静态成员变量float _x),另一个是指向虚函数表的指针(_vptr_Point)。

类的定义中只要出现虚函数,就会生成一个虚函数表(如上图的Virtual table for Point),虚函数表中存放着指向类型
信息(type_info for Point)的指针以及指向其他虚函数的指针。其他的所有静态成员变量和成员函数(静态和非静态)
都放在外面。

.
.

3.了解C++对象模型之后,前面剑指offer的第二三个问题就好回答了:

问:在该空类型中加上一个构造函数和一个虚构函数,再对它求sizeof,得到的结果如何?
由对象模型可知,构造函数和虚构函数都放在对象之外,故sizeof并不会增加,还是1;

问:那如果把析构函数标记为虚函数呢?
由C++对象模型可知,类型中有虚函数,编译器会添加一个虚函数表,并在该类型中的
每一个实例中添加一个指针指向这个虚函数表。32位机器上,一个指针占4个字节,
sizeof就是4。64位机器上一个指针占8个字节,sizeof就是8.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值