对象内存 (扩展 Data Structure Alignment)

对于一个class object来说,我们需要多少内存才能表现出来,大致分为3类,这里在前面文章有内存图

(1)非静态数据成员的综合大小,这也符合了c++对象模型的结构

(2)填充字节,就是我们所说的,内存对齐

(3)若存在虚函数,则还会产生一个为了支持virtual的指针指向虚函数表

(这里也可以说是一个引用,本质上,一个引用同场是一个指针实现了)

2017-1-14 2:35分   明天再整理   晚安

------------------------------------------------------------------------------------------------------------------------------------------------------

www.cnblogs.com/hazir/archive/2011/05/09/2447287.html

内存对齐参考博客

http://blog.csdn.net/markl22222/article/details/38051483

时间: 2024-09-29 16:54:44

对象内存 (扩展 Data Structure Alignment)的相关文章

Data Structure Alignment 2

在前面的一篇文章中,似乎明白了结构体对齐的基本规则,但是有些地方还是含糊不清.比如看下面的这个程序. 根据前面的规则很容易算出,sizeof(A)=16, sizeof(B)=24.但是在GCC下运行的结果却不是这样,所以一时有点不知问题所起,内存对齐都是编译器做的工作所以各个平台下面的实现没有得到统一规范,虽然可以#pragma pack自己设定,但是也存在问题. 总结: 1.对各个成员对齐padding之后,结构的对齐要看里面最大成员的size,比如如果struct里面最大成员是int类型,

【转载】图说C++对象模型:对象内存布局详解

原文: 图说C++对象模型:对象内存布局详解 正文 回到顶部 0.前言 文章较长,而且内容相对来说比较枯燥,希望对C++对象的内存布局.虚表指针.虚基类指针等有深入了解的朋友可以慢慢看.本文的结论都在VS2013上得到验证.不同的编译器在内存布局的细节上可能有所不同.文章如果有解释不清.解释不通或疏漏的地方,恳请指出. 回到顶部 1.何为C++对象模型? 引用<深度探索C++对象模型>这本书中的话: 有两个概念可以解释C++对象模型: 语言中直接支持面向对象程序设计的部分. 对于各种支持的底层

c++ 对象内存布局详解

今天看了的,感觉需要了解对象内存的问题. 1.何为C++对象模型? 引用<深度探索C++对象模型>这本书中的话: 有两个概念可以解释C++对象模型: 语言中直接支持面向对象程序设计的部分. 对于各种支持的底层实现机制. 直接支持面向对象程序设计,包括了构造函数.析构函数.多态.虚函数等等,这些内容在很多书籍上都有讨论,也是C++最被人熟知的地方(特性).而对象模型的底层实现机制却是很少有书籍讨论的.对象模型的底层实现机制并未标准化,不同的编译器有一定的自由来设计对象模型的实现细节.在我看来,对

[转载]多重继承及虚继承中对象内存的分布

粘过来的效果还不错:) 本位通过不断地完善讲解多重继承及虚继承中对象内存的分布. 读的时候不要着急,第一遍会有些晕,第二遍就会好很多. 能帮助加深对多重继承及虚继承对象内存的分布情况. 多重继承及虚继承中对象内存的分布     这篇文章主要讲解G++编译器中虚继承的对象内存分布问题,从中也引出了dynamic_cast和static_cast本质区别.虚函数表的格式等一些大部分C++程序员都似是而非的概念. 本文是介绍C++的技术文章,假定读者对于C++有比较深入的认识,同时也需要一些汇编知识.

Plain old data structure(POD)

Plain old data structure, 缩写为POD, 是C++语言的标准中定义的一类数据结构,POD适用于需要明确的数据底层操作的系统中.POD通常被用在系统的边界处,即指不同系统之间只能以底层数据的形式进行交互,系统的高层逻辑不能互相兼容.比如当对象的字段值是从外部数据中构建时,系统还没有办法对对象进行语义检查和解释,这时就适用POD来存储数据. 定义 POD类型包括下述C++类型,以及其cv-qualified的类型,还有以其为基类型的数组类型: 标量类型(scalar typ

对象内存布局与访问

对象内存布局 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header).实例数据(Instance Data)和对齐填充(Padding). 对象头 HotSpot虚拟机的对象头包括两部分信息:运行时数据和类型指针. 运行时数据 用于存储对象自身的运行时数据,如哈希码(HashCode).GC分代年龄.锁状态标志.线程持有的锁.偏向线程ID.偏向时间戳等. 类型指针 即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例. 如果对象是一个Ja

黑马程序员---OC基础7【ARC概念】【ARC对象内存管理】【分类Category】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [ARC概念]   1.指针的分类 1)强指针,默认的情况下,所有的指针都是强指针,关键字strong: 2)弱指针,_ _weak关键字修饰符的指针 2.ARC概念 自动引用计数 永远不要写retain和release.autorelease三个关键字 编译器会在编译的时候自动插入retain和release.autorelease, 是一个编译器的特性:“垃圾回收”是运行时的特性 3.ARC工

对象内存布局 (13)——上一篇的纠正

下面来看看虚基类对对象内存布局的影响.虚基类的主要作用就是在所有的派生类中,保留且仅保留一份虚基类的suboject. #include <iostream> using namespace std; class Base { public: int m_base; Base():m_base(20){} virtual void vfBase_1() { cout << "This is in Base::vfBase_1()" << endl;

JVM内存模型及String对象内存分配

昨天看了一篇关于<Java后端程序员1年工作经验总结>的文章,其中有一段关于String和StringBuffer的描述,对于执行结果仍然把握不准,趁此机会也总结了下JVM内存模型. 1.JVM运行时数据区域 关于JVM内存模型之前也了解过一些,也是看过就忘,好记性比如烂笔头,记下来吧.参考此文章http://chenzhou123520.iteye.com/blog/1585224 图1 JVM运行时数据区域 (1).程序计数器(Program Counter Register): 程序计数