VS中C++对象的内存布局】的更多相关文章

本文主要简述一下在Visual Studio中C++对象的内存布局,这里没有什么测试代码,只是以图文的形式来描述一下内存分布,关于测试的代码以及C++对象模型的其他内容大家可以参考一下陈皓先生的几篇博文以及网上的其他一些文章: <C++虚函数表解析>:http://blog.csdn.net/haoel/article/details/1948051 <C++对象的内存布局(上)>:http://blog.csdn.net/haoel/article/details/3081328…
1. 内存布局 在HotSpot虚拟机中,对象的内存布局可以分为三部分:对象头(Header). 实例数据(Instance Data)和对齐填充(Padding). 1) 对象头(Header): 对象头又可以分为两部分: 第一部分用来存储对象自身的运行时基本数据信息.如哈希码.GC分代年龄.锁状态标示.线程持有的锁等.这部分数据的长度在32bit和64bit虚拟机上分别为32bit和64bit.官方称呼是"Mark Word". 第二部分是类型指针,或者说指向类的元数据信息的引用.…
在hotSpot虚拟机中,对象在内存中的布局可以分成对象头.实例数据.对齐填充三部分. 对象头:主要包括: 1.对象自身的运行行元数据,比如哈希码.GC分代年龄.锁状态标志等,这部分长度在32位虚拟机中为32bit(64位中为64bit),为方便存储这部门的数据结构不是固定的. 2.一个类型指针,指向类元数据,表明该对象所属的类型:另外如果对象是Java数组,那么对象头中还必须有一块用于记录数组长度的数据. 实例数据:它是对象真正存储的有效信息,包括程序代码中定义的各种类型的字段(包括从父类继承…
  一.对象的内存布局 已主流的HotSpot虚拟机来说,   在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header).实例数据(Instance Data)和对齐填充(Padding). 1.对象头(Header)     HotSpot虚拟机的对象头包括两部分信息,         第一部分用于存储对象自身的运行时数据,如哈希码(HashCode).GC分代年龄.锁状态标志.线程持有的锁.偏向线程ID.偏向时间戳等,这部分数据的长度在32位和64位的虚拟机(…
C++ 对象的内存布局(上) 陈皓 http://blog.csdn.net/haoel 点击这里查看下篇>>> 前言 07年12月,我写了一篇<C++虚函数表解析>的文章,引起了大家的兴趣.有很多朋友对我的文章留了言,有鼓励我的,有批评我的,还有很多问问题的.我在这里一并对大家的留言表示感谢.这也是我为什么再写一篇续言的原因.因为,在上一篇文章中,我用了的示例都是非常简单的,主要是为了说明一些机理上的问题,也是为了图一些表达上方便和简单.不想,这篇文章成为了打开C++对象模…
概述 一个对象本身的内在结构需要一种描述方式,这个描述信息是以字节码的方法存储在方法区中的.Class本身就是一个对象,都以KB为单位,如果new Integer()为了表示一个数据就占用KB级别的内存就有点不值了,下面讲解JVM是如何做的.为了表示对象的属性.方法等信息,不得不需要结构描述.Hotspot VM使用对象头部的一个指针指向Class区域的方式来找到对象的Class描述,以及内部的方法.属性入口.如下图所示: 在HotSpot虚拟机中,对象在内存中存储布局分为2块区域:对象头(He…
对象的内存布局 平时用java编写程序,你了解java对象的内存布局么? 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域: 对象头 实例数据 对齐填充 对象头 对象头包括两部分信息: MarkWord 第一部分用于存储对象 自身 的 运行时数据 ,如: 哈希码(HashCode) GC分代年龄 锁状态标志 线程持有的锁 偏向线程ID 偏向时间戳 这部分数据的长度在32和64位虚拟机中分别为32bit和64bit,官方的名称是 "MarkWord". Mark Word…
简述 今天继续写<深入理解java虚拟机>的对象创建的理解.这次和上次隔的时间有些长,是因为有些东西确实不好理解,就查阅各种资料,然后弄明白了才来做记录. (此文中所阐述的内容都是以HotSpot虚拟机为例的.) 对象的创建 java程序在运行过程中无时无刻都有对象被创建出来,那么创建对象是个怎么样的过程呢?还是看看我自己的理解吧. 判断是否已经执行类加载 当虚拟机遇到一条new指令时 ,首先去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载…
本文转载自haoel博主的博客:陈皓专栏 [空谷幽兰,心如皓月] 原文地址:C++ 对象的内存布局(上) C++ 对象的内存布局(上) 陈皓 http://blog.csdn.net/haoel 点击这里查看下篇>>> 前言 07年12月,我写了一篇<C++虚函数表解析>的文章,引起了大家的兴趣.有很多朋友对我的文章留了言,有鼓励我的,有批评我的,还有很多问问题的.我在这里一并对大家的留言表示感谢.这也是我为什么再写一篇续言的原因.因为,在上一篇文章中,我用了的示例都是非常简…
在 Java 程序中,我们拥有多种新建对象的方式.除了最为常见的 new 语句之外,我们还可以通过反射机制.Object.clone 方法.反序列化以及 Unsafe.allocateInstance 方法来新建对象. 其中,Object.clone 方法和反序列化通过直接复制已有的数据,来初始化新建对象的实例字段.Unsafe.allocateInstance 方法则没有初始化实例字段,而 new 语句和反射机制,则是通过调用构造器来初始化实例字段. 以 new 语句为例,它编译而成的字节码将…
这里以HotSpot为例,且所说的对象指普通的Java对象,不包括数组和Class对象等. 1.对象创建的过程 1.类加载.解析.初始化:虚拟机遇到new时先检查此指令的参数是否能在常量池中找到类的符号引用,并检查符号引用代表的类是否被加载.解析.初始化,若没有则先进行类加载. 2.对象内存分配:类加载检查通过后,虚拟机为新生对象分配内存,对象所需内存大小在类加载完成后便可完全确定.分配内存的任务等同于从堆中分出一块确定大小的内存.(具体分配策略见:JVM内存分配策略-MarchOn) 根据内存…
C++对象的内存布局以及虚函数表和虚基表 本文为整理文章, 参考: http://blog.csdn.net/haoel/article/details/3081328 http://blog.csdn.net/angelxf/article/details/7746034 整理的也不到位,还有很多不理解,先记下来. 遇到了一个面试题,是求对象所占空间的大小了.于是想了解一下C++中对象内存的布局. 先来一些结论,以便应付面试: l  空类.单一继承的空类.多重继承的空类所占空间大小为:1(字节…
在c++发明的初期对于c++对象模型的争论从来没有停止过直到标准委员会通过了最终的c++对象模型这件事情才变得尘埃落定.C++对象模型可能是最不需要去解释的,但是又是不得不去说的因为c++的入门最先接触的就是c++对象.在上个世纪一共有三种c++对象模型,它们的出现可以说是一个不断优化的过程最终只有我们目前看到的c++对象模型在使用.了解c++对象模型非常重要,了解之后对于对象的内存布局,内存大小,虚函数以及静态数据成员和成员函数的理解有非常巨大的帮助.言归正传,下面就来分别讨论c++的三种对象…
对象的内存布局   在HotSpot虚拟机中,对象在内存中的存储布局可以划分为三个区域:对象头,实例数据,对齐填充.   对象头包括两部分信息:第一部分用于存储对象自身的运行时数据,如哈希码,GC分代年龄,锁状态标志等.对象头的另一部分是类型指针,即对象指向向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例.   实例数据部分是对象真正存储的有效信息,也是代码中所定义的各种类型字段的内容.   对齐填充并不是一定存在的,它仅仅起着占位符的作用,这是由于HotSpot VM规定对…
一 Java对象的内存布局 在HotSpot虚拟机中,对象在内存中的布局分为3个区域 对象头(Header) Mark Word(在32bit和64bit虚拟机上长度分别为32bit和64bit)存储对象自身的运行时数据,包括哈希码,GC分代年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向时 间戳等   类型指针 即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例.但是并不是所有类型虚拟机实现都必须在对象数据上保留类型指针,如果对象是一个java数组,那在对象头中还必…
先来看看Java对象在内存中的布局   一 Java对象的内存布局 在HotSpot虚拟机中,对象在内存中的布局分为3个区域 对象头(Header) Mark Word(在32bit和64bit虚拟机上长度分别为32bit和64bit)存储对象自身的运行时数据,包括哈希码,GC分代年龄,锁状态标志,线程持有的锁,偏向线程ID,偏向时 间戳等   类型指针 即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例.但是并不是所有类型虚拟机实现都必须在对象数据上保留类型指针,如果…
对象头 class oopDesc { ... private: volatile markOop _mark; union _metadata { Klass* _klass; narrowKlass _compressed_klass; } _metadata; ... } 在hotspot中对象指针称为oop(ordinary object pointer),而oopDesc则是对象头的结构..除了Klass(之所以叫klass是因为class是C++关键字)指针外,,还由一个_mark字…
一 对象的内存布局: 在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header),实例数据(Instance Data)和对齐填充(Padding). HotSpot的对象头包括两部分信息,一部分存储对象运转时自身信息,例如hashCode,GC分代年龄,锁状态标志,线程持有的锁,偏向线程id,偏向时间戳等,这部分数据的长度在32和64位虚拟机中分别为32和64位,官方称之为“Mark World”.对象在运行时产生的数据很多,其实早已经超出了32或64位BitMa…
原文地址:http://blog.csdn.net/haoel/article/details/3081328 C++ 对象的内存布局 陈皓 http://blog.csdn.net/haoel 前言 07年12月,我写了一篇<C++虚函数表解析>的文章,引起了大家的兴趣.有很多朋友对我的文章留了言,有鼓励我的,有批评我的,还有很多问问题的.我在这里一并对大家的留言表示感谢.这也是我为什么再写一篇续言的原因.因为,在上一篇文章中,我用了的示例都是非常简单的,主要是为了说明一些机理上的问题,也是…
对象实例化内存布局与访问定位 从各自具体的内存分配上来讲 new 的对象放在堆中 对象所属的类型信息是放在方法区的 方法当中的局部变量放在栈空间 这 new 的对象怎么把三块粘合到一起 就是这章的内容了 对象实例化 面试题 美团: 对象在 JVM 中是怎么存储的? 对象头信息里面有哪些东西? 蚂蚁金服:二面 Java 对象头有什么? 从对象创建的方式和步骤开始说 对象创建方式 new:最常见的方式,单例类中调用 getInstance 的静态类方法,XXXFactory 的静态方法 Class…
1. 对象的创建和分配 创建对象(如克隆.反序列化)通常仅仅一个new关键字,但在虚拟机中,对象的创建的过程需要如下步骤: 类加载检查 先去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并检查这个符号引用代表的类是否已被加载.解析.初始化过,若没有,则必须先执行相应的类加载过程. 为新生对象分配内存 对象所需内存大小在类加载完成后便可完全确定,为对象分配空间的任务等同于把一块确定大小的内存从java堆中划分出来.根据java堆内存是否绝对规整,划分方法不同: 1)指针碰撞(Bump…
HotSpot采用了OOP-Klass模型来描述Java类和对象.OOP(Ordinary Object Pointer)指的是普通对象指针,而Klass用来描述对象的具体类型.为了更好理解这个模型,首先要介绍一下C++的内存对象模型和虚函数. 1.C++类对象的内存布局 我们使用Visual Studio工具来查看C++对象的内存布局,所以需要在当前项目上右键单击选择"属性"后,打开属性页,在配置属性->C/C++->命令行下的其它选项文本框中配置如下命令: /d1 re…
一.先上答案 这个问题有坑,有两种回答 第一种解释: object实例对象,占16个字节. 第二种解释: Object o:普通对象指针(ordinary object pointer),占4个字节. new Object():object实例对象,占16个字节. 所以一共占:4+16=20个字节. 第二种解释就是在玩文字游戏了,但还是要知道的. 二.这个答案适用于所有情况吗 并不是,这个答案只适用于现在一般默认情况. 准确的说,只适用于Hotspot实现的64位虚拟机,默认开启了压缩类指针和压…
对于 Java 虚拟机,我们都知道其内存区域划分成:堆.方法区.虚拟机栈等区域.但一个对象在 Java 虚拟机中是怎样存储的,相信很少人会比较清楚地了解.Java 对象在 JVM 中的内存布局,是我们了解并发编程同步机制的基础. 在 HotSpot 虚拟机中,对象在内存中存储的布局可以分为 3 块区域:对象头(Header).实例数据(Instance Data)和对齐填充(Padding). 对象头 HotSpot 虚拟机的对象头包括两部分信息,第一部分用于存储自身运行时的数据,第二部分用于存…
主要从三个方面来讲: 1 单一继承 2 多重继承 3 虚拟继承 1 单一继承 (1)派生类完全拥有基类的内存布局,并保证其完整性. 派生类可以看作是完整的基类的Object再加上派生类自己的Object.如果基类中没有虚成员函数,那么派生类与具有相同功能的非派生类将不带来任何性能上的差异.另外,一定要保证基类的完整性.实际内存布局由编译器自己决定,VS里,把虚指针放在最前边,接着是基类的Object,最后是派生类自己的object.举个栗子: class A { int b; char c; }…
之前介绍过了普通对象比如系统自带的int等对象的对齐方式,在学习类型转换的时候遇到了自定义类型的继承体系中的downcast与upcast. 于是顺藤摸瓜,摸到了这里.发现还是 陈皓的博客里面写的最早也最易懂.http://blog.csdn.net/haoel/article/details/3081328 多重继承: 在这个例子中,我找到了upcast是安全的背后原理. 我们可以看到: 1)  每个父类都有自己的虚表. 2)  子类的成员函数被放到了第一个父类的表中. 3)  内存布局中,其…
前一段时间再次拜读<Inside the C++ Object Model> 深入探索C++对象模型,有了进一步的理解,因此我也写了四篇博文算是读书笔记: Program Transformation Semantics (程序转换语义学) The Semantics of Copy Constructors(拷贝构造函数之编译背后的行为) The Semantics of Constructors: The Default Constructor (默认构造函数什么时候会被创建出来) The…
1.对象的创建过程 class loading class linking(verification,preparation,resolution) class initializing 申请对象内存 给对象的成员变量赋默认值 调用构造方法 成员变量顺序赋初始值 执行构造方法语句(如果有父类,则先调用父类的构造方法) 2.对象在内存中的存储布局 由于对象在内存中分配非常的依赖环境配置,所以先看下虚拟机的配置 1.观察虚拟机的配置 java -XX:+PrintCommandLineFlags -…
每个虚拟机都有它自己的对象布局,本文我们将针对sscli源码和windbg调试器来查看不同类型的.net对象布局. 在.net虚拟机里,每个对象都需要保存这些信息: 对象的类型: 对象实例的成员属性(field)值: hash值.锁信息等其他数据结构. 普通对象 在CLR里,对象在托管代码(managed code)和非托管代码(unmanaged code)里有不同的表现形式.在托管代码里,所有对象的基类Object类型是在 clr\src\bcl\system\Object.cs里定义,而其…
看了 VC++中内存对齐 这篇文章,感觉说复杂了,根据我的总结,要算出结构体的内存大小和偏移量,只要清楚结构体各成员的内存布局就行了,下面介绍一下我总结的规则,有不对之处,欢迎回复. 1.实际PACK值根据声明值.成员值中较小的得到.声明值是使用#pragma pack(n)声明的值,成员值则是指结构体中最大的一个数据类型的大小,如int为4,short为2...,如果没有声明,实际PACK值就是成员值,举例: #pragma pack(8) struct sta { char a; char…