博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c++作业第二周下
阅读量:6241 次
发布时间:2019-06-22

本文共 1137 字,大约阅读时间需要 3 分钟。

题目描述:1. 分别给出下面的类型Fruit和Apple的类型大小(即对象size),并通过画出二者对象模型图以及你的测试来解释该size的构成原因。

class Fruit{test   int no;   double weight;   char key;public:   void print() {   }   virtual void process(){   }};   class Apple: public Fruit{   int size;   char type;public:   void save() {   }   virtual void process(){   }};

当类里面存在虚函数时,这个类所占的内存就会比没有虚函数时候大一点,大的位置是在类的成员变量前面会多出一个指针(vptr),它指向虚指针表(vtbl),虚指针表里面的每一个指针再指向对应的虚函数。从而实现动态绑定。

在数据存储时,由于内存是按照最小块分配的,且根据c++标准,成员的内存顺序与代码的定义顺序相同,且在初始化子类的对象时,会先初始化父类的对象,再初始化子类的对象。
测试代码如下:

#include 
using namespace std;class Fruit{public: int no=10; double weight; char key;public: void print(){} virtual void process(){}};class Apple: public Fruit{public: int size; char type;public: void save(){} virtual void process(){}};int main(){ cout<<"Fruit大小="<
<

使用cb编译器mingw32-gcc-4.7.1的运行结果如下:

clipboard.png

二者的对象模型图如下

clipboard.png

由于是32位版本,因此根据运行结果int类型大小为4,double为8,char大小为1.
又由于内存对齐原则。其内存模型应如下图所示:

clipboard.png

虚函数表指针大小与int类型相同为4,32位最小分配内存为8,不足8会补足,因此
Fruit大小等于4+4+8+4=20补足8的倍数为24.
Apple大小等于4+4+8+4+4+4=28补足8倍数为32.
使用vs MSBuild运行结果如下:

clipboard.png

内存图如下:

clipboard.png

vs为64位,所以指针为8字节因此这种情况下

Fruit大小为 8+8+8+8=32
Apple大小为 8+8+8+8+8=40

转载地址:http://aqdia.baihongyu.com/

你可能感兴趣的文章
模拟 URAL 1149 Sinus Dances
查看>>
Oracle 11G 数据库迁移【expdp/impdp】
查看>>
17.EXTJs 中icon 与iconCls的区别及用法!
查看>>
3.mybatis实战教程(mybatis in action)之三:实现数据的增删改查
查看>>
Caused by: Unable to load bean: type: class:com.opensymphony.xwork2.ObjectFactory - bean - jar
查看>>
让你拥有超能力:程序员应该掌握的统计学公式
查看>>
互联网组织的未来:剖析 GitHub 员工的任性之源
查看>>
Java 开源博客 Solo 1.4.0 发布 - 简化
查看>>
Oracle巡检
查看>>
【转载】胜者树
查看>>
查看mysql数据库存放的路径|Linux下查看MySQL的安装路径
查看>>
selenium+testNG+Ant
查看>>
1024程序员节,你屯书了吗?(内含福利)
查看>>
移动端JS 触摸事件基础
查看>>
Flex拖动原来如此简单
查看>>
温故而知新:什么是wcf
查看>>
centos语言设置
查看>>
php安装
查看>>
Fragment在getUserVisibleHint时进行加载数据的问题记录
查看>>
使用线程池模拟处理耗时任务,通过websocket提高用户体验
查看>>