[Boolan] C++第四周 homework 虚函数表与内存对齐
来源:互联网 发布:打铃软件 编辑:程序博客网 时间:2024/06/09 19:38
参考链接:C++ 虚基类表指针字节对齐模型
题目:
分别给出下面的类型Fruit和Apple的类型大小(即对象size),并通过画出二者对象模型图以及你的测试来解释该size的构成原因。
声明:编译器是VC6.0
对象模型图
黑色部分是我没有找到什么官方文档来解释,但是找到一边博客,并且被CSDN的C++知识库收录,应该尤其权威性。
隐藏成员的加入不能影响在其后的成员的对齐
#include <iostream>class Fruit{public: void print() { printf("void print()\n"); } virtual void process() { printf("void process()\n"); }private: int no; double weight; char key;};class Apple: public Fruit{public: void save() { } virtual void process(){ printf("Apple\n"); }private: int size; char type;};typedef void(*voidfunc)(void);int main(int argc, char *argv[]){ Fruit f; void *p = (void*)&f; voidfunc func; func= (voidfunc)*((int*)*(int*)(&f)); //下面有讲解 func(); printf("f.vptr = %p\n", &f); printf("f.vptr_func1 = %p\n", *(int*)&f); printf("func_process = %p\n", &Fruit::process); printf("sizeof(Fruit) = %d\n", sizeof(Fruit)); printf("-----------------------------------------------------\n"); Apple a; func= (voidfunc)*((int*)*(int*)(&a)); func(); printf("sizeof(Apple) = %d\n", sizeof(Apple)); return 0;}
虚函数表指针位于指针的开始func= (voidfunc)*((int*)*(int*)(&f));&f ----> Fruit的地址(int*)(&f)) ----> 强制转成int* 地址*(int*)(&f)) 获取虚函数表的地址(int*)*(int*)(&f) 强转虚函数表的第一个元素的地址*((int*)*(int*)(&f)) 获取虚函数表中第一个元素的内容,也就是第一个虚函数的地址
0 0
- [Boolan] C++第四周 homework 虚函数表与内存对齐
- C++类实例内存结构分析(Boolan笔记第四周)
- (Boolan) C++ 类型大小和内存分布(虚函数指针、虚表、内存对齐问题)
- Boolan STL与泛型编程 第四周笔记
- boolan ios 第四周 笔记
- [Boolan] C++第四周学习笔记
- Boolan* C++课程第四周笔记
- C++面向对象第四周笔记<Boolan>
- C-预处理与内存对齐
- Python第四周:函数与递归函数
- c/c++内存分配与内存对齐
- [Boolan] C++第四周 C++面向对象(下)
- C - 函数 Homework
- Boolan c++对象模型_内存对齐_总结
- 内存中的数据对齐与sizeof函数
- c语言中内存对齐与位域对齐
- 【C/C++】内存对齐
- Python学习第四周:函数与递归函数 - 作业20150604
- 用npm来部署快速一个httpweb服务器
- zmq_device test
- Java基础2-基本程序设计结构
- Linux环境进程间通信
- 双重检查锁定与延迟初始化
- [Boolan] C++第四周 homework 虚函数表与内存对齐
- 认识CArchive类
- memecache安装及使用详解
- 蓝桥杯 2015 2 星系炸弹
- Oracle数据库面试练习题
- Linux Android环境配置
- 拉低效率的五大坏习惯
- 流处理旅程——storm之tuple介绍
- TCP/IP 学习