Data Member的布局
Nonstatic Data Member在class object中的排列顺序和其声明顺序一样,任何中间介入的static Data Member都不会被放入对象之中
VC会将虚函数指针 放在一个类对象的最开头
1.类
class Test
{public:int nX;int nY;};class Test1 : public Test
{static int g_nNum;
public:int nZ;
};
2.结果
Test1 a;int* p = (int*)&a;*p = 10;*(p + 1) = 20;*(p + 2) = 30;cout<<"Test " << sizeof(Test) << endl;cout << "Test1 " << sizeof(Test1) << endl;cout << a.nX<<endl;cout << a.nY << endl;cout << a.nZ << endl;
查看他们的offset和memory的值
Test1 a;printf("%p\n", &(a.nX));printf("%p\n", &(a.nY));printf("%p\n", &(a.nZ));printf("%d\n", &Test1::nX);printf("%d\n", &Test1::nY);printf("%d\n" ,&Test1::nZ);
注意区分
int Test1::*p1 = 0;
int Test1::*p2 = &Test1::nX;cout << p2 << endl;
p2输出的结果是0
以此来区分一个指向Data Member的指针 并没有指向一个第一个Member 和 一个指向Data Member的指针 指向了第一个Member
所以编译器在进行存取操作时候,经常要进行-1操作
Data Member的布局相关推荐
- vs开发人员命令查看C++类 data member 内存布局
C++中类的数据成员在内存中时如何分布的,有继承,虚拟继承等情况下又是怎么分布的?在VS编译器中可以查看. 源代码如下: #include<iostream> using namespac ...
- 深度探索C++ 对象模型(7)-Data member的布局(虚继承)
虚拟继承 namespace ObjectMultiDerived {class Point2d {public:// has virtual functionsvirtual void print( ...
- 深度探索C++ 对象模型(7)-Data member的布局(多重继承)
多重继承 namespace ObjectMultiDerived {class Point2d {public:// has virtual functionsvirtual void print( ...
- 深度探索C++ 对象模型(7)-Data member的布局(无继承、继承无多态、继承多态、多层继承)
无继承 继承无多态 继承多态 虚表 : 用来存放基类的每一个虚函数,再加上首位的一个slots(支持RTTI). 每个class object导入一个vptr,提供执行期的链接,使得每一个class ...
- c++Data Member的绑定
Data Member的绑定 Data Member的绑定 Data Member的布局 Data Member的存取 继承与Data Member 含多态的继承 多重继承 虚继承 指向Data Me ...
- 继承与 Data Member(2)
加上多态的情况 如果我要处理一个坐标点, 而不在意这是一个 Point2d 或 Point3d 实例, 那么就需要在继承关系中提供一个 virtual function 接口: class Point ...
- Data Member 的存取
考察以下代码: Point3d origin; origin.x = 0.0; 此例中 x 的存取成本是什么? 答案则是视 x 和 Point3d 而定(别打脸, 我知道这是废话). 具体的呢? 因为 ...
- 深度探索C++ 对象模型(6)-Data member的存取
nonstatic data member 需要在class object起始地址加上该member的偏移. class A {public: int x; int y;}; A a; a.y = 0 ...
- 深度探索C++ 对象模型(6)-Data member的绑定
防御性程序设计 1).将class声明起头处放data member; 代码示例: class Point3d{ float x,y,z; public://etc } 2). class的声明处放i ...
- Data Member 的绑定
考察以下代码: extern float _x;//user code class Point3d { public:Point3d(float, float, float);//问题来了, 是哪一个 ...
最新文章
- AB1601中断的问题
- 启动hbase后hregionserver没有启动
- 性能测试中脚本怎么写_脚本在流程中的性能影响
- 数据结构课上笔记10
- python面向对象实现简易银行管理员页面系统【导入自定义模块】
- 爬虫-请求头处理模块
- Delphi 两种类的声明方法
- 在iOS项目中,这样才能完美的修改项目名称
- oraccle 索引管理
- linux没有找到可用磁盘,在Linux上,有没有一种更像python的方法来获取可用磁盘设备名的列表?...
- 关于performSelector调用和直接调用区别
- IIS 7 配置备份和还原
- mysql绘制er图教程_使用MySQLWorkBench绘制ER图
- 几种视频压缩标准简介
- MATLAB绘制折线图和散点图
- SpringBoot 发送邮件和附件(实用版)
- 内网渗透学习04——域内横向移动
- 8000字干货:那些很厉害的人是怎么构建知识体系的
- shopify上传商品价格怎么改美元美金$
- L84.linux命令每日一练 -- 第11章 Linux系统管理命令 -- rpm和yum