空类型的sizeof问题与C++对象模型
来源:互联网 发布:centos php5.6 yum源 编辑:程序博客网 时间:2024/06/06 09:33
1.上次看了《剑指offer》,上面提到了空类型对象的sizeof问题,当时不太理解,就放在那里没管了,
最近看了《深度探索C++对象模型》,在发现C++的对象模型是怎么回事后恍然大悟,原来这么简单。
剑指offer第23页:
第一问好理解,空类型的实例不含任何信息,但必须占有一定空间,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; //静态成员变量};
该类型的对象模型如下:
如上图: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.
- 空类型的sizeof问题与C++对象模型
- 【C++】C++对象模型的sizeof问题
- 虚拟继承下空类型的sizeof问题
- char 类型的移植问题与C++类对象的sizeof()大小计算
- [C++对象模型][6]sizeof与对象内存布局
- [C++对象模型][6]sizeof与对象内存布局
- [C++对象模型][6]sizeof与对象内存布局
- c++ 基础语法一(空类型的sizeof)
- java空对象与空的区别
- sizeof(空类)问题总结
- 类对象大小的 sizeof 计算问题
- sizeof()与对象的内存布局
- 使用模型驱动ModelDriven,出现对象为空问题
- Objective-C的对象模型与运行时
- c中sizeof()运算符的问题
- 关于对象动态类型的一些问题 Object-C 2.0
- C++-sizeof()与strlen()的区别
- C语言:strlen与sizeof的区别
- Filter学习杂记
- $.ajax()方法详解
- PHP 热更新的简单程序
- Hadoop学习笔记 2
- 先验概率与后验概率的区别
- 空类型的sizeof问题与C++对象模型
- 机器学习练习(四)——异常检测
- 【面经笔记】多线程
- 填写设置小程序信息-微信小程序开发-视频教程3
- oracle删除
- VS 2013 启动调试卡死
- 出现setw(size)与setfill(char)有关的缺失问题
- 字符串方法
- linux free 命令详解