美文网首页
Boolan c++对象模型_内存对齐_总结

Boolan c++对象模型_内存对齐_总结

作者: 竹林柳岸 | 来源:发表于2017-05-18 23:01 被阅读0次

前言:

c++ language博大精深,需要我们透过现象看清本质才是正道。不积硅步,无以至千里;不积小流,无以成江海。坚持总结,坚持写作。下面是对第四周的作业的总结。

1. 对象模型图

图1 对象模型图

2. 内存对齐

以下结果来自vs2017 x86。Fruit占32字节,Apple占40字节。


图2 Fruit 图3 Apple

3. 一些相关知识点总结

(1) 数据类型所占字节:long int 在windows x64下也是占4个字节,windows x64下只有指针会扩展为8字节,其他的数据类型都和32位下是一致的。
(2) 虚函数表中虚函数的地址是按照类中声明顺序排列的,对于派生类没有覆盖的虚函数,基类的虚函数地址放在前面,派生类的虚函数地址放在后面。对于派生类覆盖定义的虚函数,则在虚函数表中,存放在原来基类中该虚函数的地址放置的位置上。
(3) 虚函数表最后有一个结束节点,如果值是0,那么表示是这个对象的最后一个虚函数表;如果是1,那么表示后面还有虚函数表。(这样设计应该是为了多重继承,方便查找虚函数。如果多个基类含有虚函数表,那么派生类对象也会相应有多个虚函数指针,指向各自虚函数表。)
(4)多重继承,派生类的成员函数放在第一个基类的虚函数表中,按照声明顺序排列父类。子类的虚函数会覆盖相应的含有这个虚函数的各个父类的虚函数表中的位置。
(5)含有虚函数的类对象有各自的虚函数表,虚函数表不共用,虚函数共用。(这样设计的好处,之后再思考)
(6) 不同编译器和操作系统下,对象的内存布局和所占空间大小有所不同。
(7) RTTI在运行时的类型识别,eg, typeid(obj).name() 会返回一个字符串,表示obj的类型,如class Fruit。不同编译器返回的字符串会有区别。type_info的指针存放在虚函数表中第一个地址的前面,第一个地址是第一个虚函数的地址 。两个运算符:typeid,dynamic_cast.
(8)内存对齐,取类中成员最大占用的大小来对齐。

ps. 时间紧迫,以后会继续补充。另外c++笔记3中对原型模式的理解很有偏差,后面会做更改。

相关文章

  • Boolan c++对象模型_内存对齐_总结

    前言: c++ language博大精深,需要我们透过现象看清本质才是正道。不积硅步,无以至千里;不积小流,无以成...

  • boolan/C++面向对象高级编程 part3

    C++面向对象高级编程 part3 @(boolan C++)[C++] 概述 面向对象的三种关系 composi...

  • Boolan/C++面向对象高级编程 part2

    C++面向对象高级编程 part2 @(boolan C++)[C++]2017-10-22 14:17:56...

  • 结构体内存对齐

    对象内存对齐 探讨的问题 1.什么是内存对齐?2.为什么要做内存对齐?3.结构体内存对齐规则4.源码内存对齐算法 ...

  • 2018-03-22

    Boolan C++设计模式二 “对象创建”模式:通过“对象创建”模式绕开new,来避免对象创建(new)过程中所...

  • 内存对齐

    知识点概要 OC对象内存对齐结构体内存对齐 OC对象内存对齐 计算内存大小的三种方式 1.sizeof:系统提供的...

  • 内存对齐

    在C语言柔性数组一文中,提到了内存对齐,于是想写篇文章总结总结内存对齐。 内存对齐 为什么需要内存对齐 计算机系统...

  • golang 和 C++ 的内存对齐

    golang 和 C++的内存对齐,基本一致,记住规则和对应类型的 size 即可 内存对齐规则 有效对齐值是固定...

  • C++ 对象内存模型

    (很久之前写的了,先扔上来 继承 (无虚函数时) 单继承 类的对象的内存布局如下所示: 类中的成员变量的存储顺序从...

  • iOS 开发 内存对齐(练习)

    目录 内存对齐规则 对齐系数 面试题演练 一、内存对齐规则 (关于面试题中结构体内存对齐计算总结) 1.1、数据成...

网友评论

      本文标题:Boolan c++对象模型_内存对齐_总结

      本文链接:https://www.haomeiwen.com/subject/dulexxtx.html