最近看了下Inside C++里面讲的对虚继承层次的对象的内存布局,发现在不同编译器实现有所区别。因此,自己动手探索了一下。结果如下:首先,说说GCC的编译器.它实现比较简单,不管是否虚继承,GCC都是将虚表指针在整个继承关系中共享的,不共享的是指向虚基类的指针。class A {int a;vir...
分类:
其他好文 时间:
2014-08-31 17:14:21
阅读次数:
179
结构体
struct 结构体标签(可选)
{
类型1 标识符1;
类型2 标识符2;
.......
}(变量定义可选);
联合
union 可选的标签
{
类型1 标识符1;
类型2 标识符2;
........
}可选的变量定义;
联合与结构体相似,但内存布局上存在关键性的区别。结构体中每个成...
分类:
编程语言 时间:
2014-08-30 11:18:19
阅读次数:
239
看了 VC++中内存对齐 这篇文章,感觉说复杂了,根据我的总结,要算出结构体的内存大小和偏移量,只要清楚结构体各成员的内存布局就行了,下面介绍一下我总结的规则,有不对之处,欢迎回复。 1、实际PACK值根据默认值、声明值、成员值的最小值得到。默认值在32位系统中为4,声明值则是使用#pragma p...
分类:
编程语言 时间:
2014-08-24 19:19:02
阅读次数:
196
看了 VC++中内存对齐 这篇文章,感觉说复杂了,根据我的总结,要算出结构体的内存大小和偏移量,只要清楚结构体各成员的内存布局就行了,下面介绍一下我总结的规则,有不对之处,欢迎回复。1、实际PACK值根据默认值、声明值、成员值的最小值得到。默认值在32位系统中为4,声明值则是使用#pragma pa...
分类:
其他好文 时间:
2014-08-24 18:02:42
阅读次数:
178
1、 单个虚拟继承
只是为了分析而已,实际中并没有太大的作用。跟虚拟继承相关的派生类对象的内存布局跟具体的编译器相关。
(1)VS编译器:无论有无虚函数,必然含有虚基类表指针。虚基类表中的内容为本类实例的偏移和基类实例的相对偏移值。如果有虚函数,那么基类的虚函数表跟派生类的虚函数表是分开的。
在内存布局上,地址从低到高,顺序如下:派生类的虚函数表指针+虚基类表指针+派生类的成员变量+“...
分类:
编程语言 时间:
2014-08-23 11:24:30
阅读次数:
357
使用Visual Studio工具来看是类的内存分布
先选择左侧的C/C++->命令行,然后在其他选项这里写上/d1 reportAllClassLayout,它可以看到所有相关类的内存布局,如果写上/d1 reportSingleClassLayoutXXX(XXX为类名),则只会打出指定类XXX的内存布局。近期的VS版本都支持这样配置。
下面可以定义一个类,像下面这...
分类:
编程语言 时间:
2014-08-22 23:53:59
阅读次数:
474
在学习进程之前,先来了解下进程的执行环境。进程如何开始,怎么终止,程序内存布局等。...
分类:
其他好文 时间:
2014-08-21 11:30:34
阅读次数:
180
C++ 对象的内存布局(下)这篇文章的“单一虚拟继承”和“钻石型虚拟继承”时的类内存布局讲得不太清楚,我有一处疑问,我用的是VS2005,因此记录一下。
类继承图如下:
这里:类B被类B1和B2虚拟继承,而B1和B2同时被D继承。
B1的f()、B2的f()覆盖了B的f();
D的f()覆盖了B1的f(),D的f1()覆盖了B1的f1()
D的f()覆盖了B2的f(),D的...
分类:
编程语言 时间:
2014-08-19 14:38:24
阅读次数:
228
内存中对象的创建、对象的结构以及访问方式。
一、对象的创建
在语言层面上,对象的创建只不过是一个new关键字而已,那么在虚拟机中又是一个怎样的过程呢?
(一)判断类是否加载。虚拟机遇到一条new指令的时候,首先会检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号代表的类是否被加载、解析并初始化。如果没有完成这个过程,则必须执行相应类的加载。
(二)在堆上...
分类:
编程语言 时间:
2014-08-17 20:00:52
阅读次数:
196
当程序文件运行为进程时,进程在内存中获得空间。这个空间是进程自己的内存空间。每个进程空间按照如下方式分为不同区域: 进程内存空间布局图text:代码段。存放的是程序的全部代码(指令),来源于二进制可执行文件中的代码...
分类:
系统相关 时间:
2014-08-17 19:55:52
阅读次数:
404