c++ object的内存空间布局

基本规则:

1.各data member的自然边界为其字节大小(char为1,short为2,int为4),并按照各自的自然边界对齐;

2.整个object的总自然边界为最大data memeber的自然边界,总大小必须为总自然边界的倍数(一般为1,2,4,8)。

3.空类的大小为1;

例:struct S{char c;double i;int j;};

  sizeof(S)为: 1+补7+8+4=20,总边界为8,总大小必须为8的倍数,补4,最终为24;

  class D{char i;S k;int j;};

  sizeof(D)为:1+补7(S边界为8)+24+4 = 36,总边界为8,补4,最终为40;

考虑继承的情况:

1.成员函数不占用object的内存,多个object共享一份存放在代码区(code segment)的函数。

2.如果class中存在virtual function,那么每个object的内存开头会安插一份指针(vbptr)指向virtual function table(vtbl)。

3.如果是虚拟继承自base class,那么将在drive class object的开头安插一份指针(vfptr)指向obejct中base class的开始位置。

时间: 2024-10-19 00:58:44

c++ object的内存空间布局的相关文章

续x86_64进程内存空间布局-vDSO

在上一篇Linux x86_64进程内存空间布局中谈了两个不同参数下的进程运行时内存空间宏观的分布.也许你会注意到这样一个细节,在每个进程的stack以上的地址中,有一段动态变化的映射地址段,比如下面这个进程,映射到vdso. 如果我们用ldd看相应的程序,会发现vdso在磁盘上没有对应的so文件. 不记得曾经在哪里看到大概这样一个问题: getpid,gettimeofday是不是系统调用? 其实这个问题的答案就和vDSO有关,杂x86_64和i386上,getpid是系统调用,而gettim

Linux x86_64进程内存空间布局

关于Linux 32位内存下的内存空间布局,可以参考这篇博文Linux下C程序进程地址空间局关于源代码中各种数据类型/代码在elf格式文件以及进程空间中所处的段,在x86_64下和i386下是类似的,本文主要关注vm.legacy_va_layout以及kernel.randomize_va_space参数影响下的进程空间内存宏观布局. 情形一: vm_legacy_va_layout=1 kernel.randomize_va_space=0 此种情况下采用传统内存布局方式,不开启随机化 ca

第七章——Windows内核基础-内核理论基础(内存空间布局,Windows与内核启动过程)

1.内存空间布局 X86系统支持32位寻址,因此支持2^32=4GB的虚拟内存空间,windwos系统的内存主要分为内核空间和应用层空间 每部分占2GB,其中包括一个64KB的NULL空间以及非法区域. windows内存的逻辑地址分为两部分: 段选择符和偏移地址,CPU在进行地址翻译的时候,先通过分段机制计算出一个线性地址,在通过页表机制将线性地址映射到物理地址,再从物理内存中读取数据和指令 X64的内存布局与X86的内存布局类似,X64下存在一些空洞,并且X64的最大寻址空间为2^64KB的

Object obj=new Object()的内存引用

Object obj=new Object(); 一句很简单的代码,但是这里却设计Java栈,Java堆,java方法去三个最重要的内存区域之间的关联. 假设这句代码出现在方法体中. 1.Object obj将反映到Java栈的本地变量表,这是一个本地变量的定义.是一个引用类型. 2.new Object()将会反映在Java堆中.存储了Object类型的所有实例数据值(次内存是不固定大小的,因为谁也无法确定这是对象的大小). 3.程序运行,类型信息已经加载到内存里,这些数据就在Java方法区中

Object C 内存分配大小

虽然做iOS开发也有一段时间,但一直疲于赶项目,并未仔细研究OC,难得今日比较闲又拿起OC资料研读一番,发现效果很好,不过也感慨技术更新实在过快,发现之前的资料已经和现行技术有些出入. 在某资料上对内存这一块讲解时,当给一个对象分配内存时,其内存的大小是由这个类的成员变量决定,比如: @interface  Car : NSObject { int year; NSString *make; NSString *model; } @end 对于这个Car类,该资料的输出结果是: NSObject

js object类型转换 内存泄漏 垃圾回收机制

-------------------------------------------------------------************* - object 变量名存储在栈里面,存储的是引用地址 ,指向堆里面的对象内容数据: - 内存泄漏 + 发生条件:新对象不断创建,旧对象却不清除: 为了避免内存泄漏,有垃圾及回收机制 - 垃圾回收机制(gc) + 当对象的引用地址在栈中没有引用时,内存占比过高,垃圾回收车会将其清除. (前提:内存占比过高,object=null:如果引用对象的变量

进程的内存空间布局

进程的内存布局在结构上是有规律的,具体来说对于 linux 系统上的进程,其内存空间一般可以粗略地分为以下几大段[1],从高内存到低内存排列: 1.内核态内存空间,其大小一般比较固定(可以编译时调整),但 32 位系统和 64 位系统的值不一样. 2.用户态的堆栈,大小不固定,可以用 ulimit -s 进行调整,默认一般为 8M,从高地址向低地址增长. 3.mmap 区域,进程茫茫内存空间里的主要部分,既可以从高地址到低地址延伸(所谓 flexible layout),也可以从低到高延伸(所谓

Object是什么

Object是什么 .Net程序员们每天都在和Object在打交道如果你问一个.Net程序员什么是Object,他可能会信誓旦旦的告诉你"Object还不简单吗,就是所有类型的基类"这个答案是对的,但是不足以说明Object真正是什么 在这篇文章我们将会通过阅读CoreCLR的源代码了解Object在内存中的结构和实际到内存中瞧瞧Object Object在内存中的结构 为了便于理解后面的内容,我先用一张图说明Object在内存中的结构 .Net中的Object包含了这三个部分 指向头

Unix下C程序内存泄露检测工具:valgrind的安装使用

Valgrind是一款用于内存调试.内存泄漏检测以及性能分析的软件开发工具. Valgrind的最初作者是Julian Seward,他于2006年由于在开发Valgrind上的工作获得了第二届Google-O'Reilly开源代码奖. Valgrind遵守GNU通用公共许可证条款,是一款自由软件. Valgrind的安装和使用 去官网www.valgrind.org下载最新版本的valgrind,我这里下载的是valgrind 3.11.0.tar.bz2. #tar xvf valgrind