【转】C++类的实例分布
来源:互联网 发布:java virtual 编辑:程序博客网 时间:2024/05/17 02:16
|
这个例子的主要目的是为了说明各类型的成员在类中如何分配,vtable在类中的位置以及多态的内部如何实现。
二:分析:
假设输出为这个示例代码最后被编译成a.out的可执行文件。
1, objdump –C -t -j .data a.out|grep data
输出信息为:
08049d
08049d
08048aa4 w O .rodata 00000008 typeinfo for empty
08049d
08049d
08049d
08048aac w O .rodata 00000008 typeinfo for Base
08049d00 w .data 00000000 data_start
08049d
08048acd w O .rodata 00000008 typeinfo name for Derive
08049d
08049d
08048ab4 w O .rodata
红色的三行说明了一些信息:
A,类的静态成员变量不是在类里面分配的,这也正好符号了我们一般的逻辑,因为我们很可能在没有一个类实例的情况下访问它这个成员(如果是public的);
B,全局变量也是在data段里面。
C,类的函数不是在类里分配的,而是联合类名和参数变成了另外一个函数名,调用的时候传相应的类的this指针进去。
D,拥有虚函数的类会多出四个字节用于存放指向vtable的指针。
E,当发生子类指针向父类指针赋值的时候,会发生截断,对应于父类的大小的区域被分给父类,其余被截掉,但是因为vtable的指针是放在类的开始的,所以,子类的虚函数指针被赋给了父类,于是调用的时候就调用了子类的函数,这就是虚函数的内部实现!!!
2, 修改第56行,如果改成:
int addr = *((int *)(*(int *)(pointB))+1(or 2 or 3));这样就可以分别调用第一第二个虚函数。
从这里可以看出,虚函数的位置在拥有虚函数的类的第一个位置。
3, 从59,61,63行可以看出,
类的数据的排列是按照它的申明顺序的。
4, 从.rodata可以看出,vtable的内容本身是放在rodata段里面的也就是说是不可修改的。
5, 如果把43行:
char *test="hello world\n";
然后*test=”good bye”;
你会看到编译的出错信息!
原因在于”hello world\n”以及所有这些待打印出来的字符串都是放在readonlydata 段的。
要修改一个只的区域的内容当然会错了。
但是test这个变量本身你是看不到的在符号表里面,因为它会被分配在堆里面,并且是 在运行时被分配的。
但是你能看到global_text的符号,它本身是被分配在data段里面的,但它所指向的内容也是在只读段里面的。
可以通过objdump –C –d –j .rodata a.out来查看所有只读段里面的内容。
注意我上面说的段是指section不对应操作系统里面的segment。
你可以用readelf –l a.out来查看具体的section 和 segment的对应关系。
一般rodata段都会被放在text segment.
上一篇:【转】 IntelliJ Idea 常用快捷键列表
下一篇:【转】C++成员函数的内存分配问题
- Greenplum创建表--分布键...
- View与ViewGroup的概念
- 一款已上市MMO手游地图同步方...
- HTML5 音视频媒体处理相关...
- Win7重装打印机驱动
- A sample .exrc file for vi e...
- 游标的特征
- IBM System p5 服务器 HACMP ...
- busybox的httpd使用CGI脚本(Bu...
- Solaris PowerTOP 1.0 发布
- linux dhcp peizhi roc
- 关于Unix文件的软链接
- 求教这个命令什么意思,我是新...
- sed -e "/grep/d" 是什么意思...
- 谁能够帮我解决LINUX 2.6 10...
- 【转】C++类的实例分布
- C 的内存分布
- C/C++的内存分布
- c程序的内存分布
- C程序的内存分布
- 用C语言实现均匀分布,瑞利分布,莱斯分布,高斯分布的分布函数
- 用C语言实现瑞利分布,莱斯分布,高斯分布的分布函数
- 进程中的内存分布(结合C语言实例)
- 类的内存分布
- C/C++程序的内存分布
- F分布的C/C++代码
- c语言共用体的内存分布
- C语言程序的内存分布
- C++ 内存的分布
- C/C++进程内存的分布
- c++:变量在内存上的分布
- echarts地图分布-实例
- 图像处理--不同噪声的分布直方图&&&均值滤波实例
- Tomcat Can't load AMD 64-bit .dll on a IA 32
- VB.NET&C#&VB较量
- 【转】 IntelliJ Idea 常用快捷键列表
- 手机端图片左右滑动效果实现
- 图像处理(五)双指数磨皮
- 【转】C++类的实例分布
- 【转】C++成员函数的内存分配问题
- 【WC】成都七中集训
- 【转】C++的64位整数
- Jquery 的height()方法在jsp中获取的高度问题
- 【转】更改Windows系统底色以保护视力
- 【转】再谈重入锁--ReentrantLock
- 【转】Java基本概念:集合类 List/Set/Map...的区别
- js解析JSON