ART中的C++对象内存布局

第一个纯血鸿蒙应用(Napi开发-ArtTS调用C/C++) Node-API是用于封装JavaScript能力为Native插件的API,独立于底层JavaScript,并作为Node.js的一部分。 阅读详情

C++11中的类所占内存大小主要是由成员变量(静态成员变量除外)决定的,成员函数(虚函数除外)是不计算在内的。

空类的占用存储空间。

class NUllclass {};

NUllclass nullclass;

64和32位下sizeof的返回值都为1。因为C++要求每个实例在内存中都有独一无二的地址。

对齐的影响:

class Base{
 private:
     int a;//四字节
    char p ;//一字节
};

Base base;
sizeof(base);

结果为8字节,需要补齐3字节。

 

  

class Base{
  private:
   int a;//四字节
    char p ;//一字节
public:
Base(int a ,char p):a(a),p(p){
}
};

Base base(100,m)
for(int i=0;i<8;i++){
unsigned char* array=(unsigned char*)(&base);
_android_log_print(4,"cPP11","i:%d,value:%d",i,array[i]);
}

输出依次:

i:0;value:100

i:1;value:0

i:2;value:0

i:3;value:0

i:4;value:109 //m的ascii码

i:5;value:0

i:6;value:0

i:7;value:0

虚函数

class Base{
  private:
   int a;//四字节
    char p ;//一字节
public:
virtual void f(){
_android_log_print(4,"cPP11","f");
};
virtual void g(){
_android_log_print(4,"cPP11","g");
virtual void h(){
_android_log_print(4,"cPP11","h");
Base(int a ,char p):a(a),p(p){
}

};
Base base;

64位sizeof(base)的大小16字节;32位sizeof(base)的大小12字节;

C++类中有虚函数的时候有一个指向虚函数的指针(vptr)32位下指针长度4个字节,64位下8个字节长

类继承自多个基类的时候可能有多个虚函数表指针,可能会占据多个内存空间。此时自然也可以通过虚函数表指针完成对类中虚函数的调用

//第一种只能当虚函数为Public的时候才行,当虚函数为private的时候不行
base.f();
base.g();
base.h();
//第二种 public或者private的时候都可以
//通过对象地址取出虚函数表地址,通过指针偏移取出几个虚函数地址
#if defined (__arm__) 
unsigned int vtableptr = *(unsigned int *)(&base);
unsigned int addrf = *(unsigned int *)vtableptr;
unsigned int addrg = *(unsigned int *)(vatableptr+4);
unsigned int addrh = *(unsigned int *)(vatableptr+8);
typedef void (*Func)(void *);
Func ffunc =(Func) addrf;
Func fgunc =(Func) addrg;
Func fgunc =(Func) addrh;
ffunc(&base);
fgunc(&base);
fhunc(&base);
#else
unsigned int vtableptr = *(unsigned long*)(&base);
unsigned int addrf = *(unsigned long*)vtableptr;
unsigned int addrg = *(unsigned long*)(vatableptr+8);
unsigned int addrh = *(unsigned long*)(vatableptr+16);
typedef void (*Func)(void *);
Func ffunc =(Func) addrf;
Func fgunc =(Func) addrg;
Func fgunc =(Func) addrh;
ffunc(&base);
fgunc(&base);
#endif

在派生类中不对基类的虚函数进行覆盖,同时派生类中还拥有自己的虚函数

class Derived:public Base{
public:
virtual void f1(){
cout<<"Derved::f1"<<endl;
}
virtual void g1(){
cout<<"Derved::g1"<<endl;
}
virtual void h1(){
cout<<"Derved::h1"<<endl;
}
};

在派生类中拥有同名函数的时候会产生覆盖

多继承,无虚函数覆盖的时候:

多继承,有虚函数覆盖的时候:

空的类是会占用内存空间的,而且大小是1,原因是C++要求每个实例在内存中都有独一无二的地址。

(一)类内部的成员变量:

普通的变量:是要占用内存的,但是要注意对齐原则(这点和struct类型很相似)。static修饰的静态变量:不占用内容,原因是编译器将其放在全局变量区。

(二)类内部的成员函数:

普通函数:不占用内存。虚函数:要占用4个以上字节,用来指定虚函数的虚函数表的入口地址。所以一个类的虚函数所占用的大小是不变的,和虚函数的个数是没有关系的。

ART中size_t实际就是unsigned int

一般编译之后的So拖到IDA里面发现函数会多一个参数,第一个参数就编译之后的this指针

 

Frida+DumpSo:从ART内存精准捕获动态加载的DEX DEX是Android应用的核心字节码格式,其动态加载机制(如DexClassLoader、CreateFromMemory)使加固应用能将业务逻辑隐藏于内存而非磁盘。理解ART虚拟机中DEX的内存构造原理——特别是art::DexFile对象的生命周期与begin_/size_字段布局——是实现无密钥脱壳的技术基础。Frida通过Hook OpenDexFileNative和CreateFromMemory等关键入口,结合内存权限修复与结构体偏移适配,可稳定捕获尚未被GC回收的原始DEX字节流;DumpS 阅读详情

相关推荐

第 18 章:ART 运行时

Android运行时(ART)是Android应用的执行环境,负责加载和执行DEX字节码。ART通过多层级编译策略(解释器、JIT、AOT)和并发垃圾回收(如CC和CMC收集器)优化性能。关键组件包括类链接器、dex2oat编译器、JIT编译器和内存管理系统。ART支持模块化更新,并通过配置文件引导优化(PGO)提升应用性能。调试能力基于JVMTI,提供断点、类重定义等功能。Android 17引入了多项改进,如分代标记-压缩GC、禁止反射修改static final字段、DEX容器格式V41等。ART架构

dengfuma的专栏 282

ART深入浅出2 -- 认识和了解Runtime Options

本文基于Android 7.1,不过因为从BSP拿到的版本略有区别,所以本文提到的源码未必与读者找到的源码完全一致。本文在提供源码片断时,将按照 android工程的路径>: 的方式,如果行号对不上,请参考类名和函数名来找到对应的源码。

doon的专栏 2494

自己用C++写的一个ART重建(OPenGL仿真)

我看网上实现ART算法一般都用matlab,所以自己动手写了一个C++版本的,可视化部分使用OpenGL开发库实现的

ART虚拟机 _ Java对象和类的内存结构

所有Java类最终的父类都是java.lang.Object,因此当我们创建一个Java对象时,必然伴随着java.lang.Object的实例化过程。Java.lang.Object在ART中有个对应的C++类art::mirror::Object,命名空间中有"mirror",表示其和Java类之间存在对应关系。当我们通过来创建一个java对象时,就会在内存空间得到一个最简单的内存结构。klass_和monitor_,分别对应于java.lang.Object中的和。

2401_87252048的博客 1004

ART算法代码程序

ART算法代码程序

artnet 开发包

舞台灯光 灯光 灯光控制通讯协议artnet sdk 开发包很难找,里面有一个示例,

FreeReflection Native层实现:ART运行时内存偏移查找技术详解

FreeReflection是一个突破Android P及以上版本反射限制的神器,它通过巧妙的内存偏移查找技术绕过ART运行时的隐藏API检查机制。本文将深入解析FreeReflection Native层的核心实现原理,特别是其如何通过精准的内存扫描技术定位关键运行时数据结构。 ## 🚀 FreeReflection的核心技术突破 在Android P(API 28)及更高版本中,Goog

gitblog_00448的博客 839

解决usbisp不识别无法烧录Atmega328P,Arduino不识别问题

如果使用Arduino IDE里面的烧录,可能会遇到一个问题,就是不识别国产这种廉价的USBISP 点击烧录引导程序,会遭遇到找不到USB设备的问题,选哪个都会提示找不到,比如选择USBasp could not find USB device with vid=0x16c0 pid=0x5dc vendor='www.fischl.de' product='USBasp' 因此,我们需要使用到progisp这一个软件的1.72版本 选择好芯片的型号后,调用编译好的HEX文...

arenascat的博客 7436

安卓系统内存池布局详情

内存池,本质上是为了高效管理内存分配和回收,减少碎片、提升性能而设计的一种内存管理机制。Java/ART虚拟机的堆内存池Native层的内存池(如Binder、SurfaceFlinger、图形缓冲区等)系统服务/驱动的内存池(如ION、Gralloc、Ashmem等)Java堆内存池:像超市货架,分新货区、老货区、说明书区Binder内存池:像快递中转站,每个进程有自己的快递仓库ION/Ashmem内存池:像大型冷库,供多进程/硬件共享大块资源“堆池分区有新老,Binder快递各自包;

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 1273

给新考上北大软件与微电子学院的同学——利用北大资源

利用北大资源 首先,恭喜大家考入北京大学!希望软院成为各位人生旅途中快乐的一站! 说明:限于本人搜集能力有限,本文只列出本人常利用的资源(上课老师会告知的资源也不在此列),本文所述的资源只是北大可利用资源的一个子集。 一、 图书馆资源:北京大学图书馆的资源数量,我就不多废话了,这里主要说一样怎样利用这些资源。 a) 传统资源分布及查找:这种资源主要包括纸质书箱、杂志、光盘等内...

Felomeng的技术博客 1万+

SCCM实战指南:从零搭建企业级Windows自动化部署平台

本文提供了一份详细的SCCM实战指南,手把手教你从零搭建企业级Windows自动化部署平台。内容涵盖环境规划、AD架构扩展、SQL Server配置、SCCM主站点安装,以及最终实现操作系统镜像的自动化部署,旨在帮助IT管理员彻底告别手动装机,实现高效、规范的Windows设备批量管理。

weixin_29251337的博客 638

一种基于 ART 内存特征的 LSPosed/Xposed/分身环境 完美检测方案

摘要:基于ART内存布局的Xposed框架检测方案 本文提出了一种Tier 0级别的Android反作弊方案,通过分析ART虚拟机的内存布局特征来检测Xposed类框架(如LSPosed)。核心原理是利用ClassLinker必须维护所有ClassLoader的特性:LSPosed要注入模块代码就不得不将其ClassLoader注册到ClassLinker的class_loaders_链表中,否则会被垃圾回收机制回收。该方案采用内存暴力扫描技术,绕过所有Hook手段,通过特征匹配定位ClassLinker和

世界美景的博客 1589

ARM架构下Horizon Client安装全攻略:从依赖检查到环境变量配置

本文详细介绍了在ARM架构设备上安装VMware Horizon Client的全过程,包括依赖检查、软件包获取、系统部署和环境变量配置。特别针对华为鲲鹏等ARM平台,提供了从基础准备到性能优化的完整指南,帮助用户高效完成虚拟桌面客户端的部署与调优。

github5actions的博客 553

2.2 HotSpot 对象内存布局

HotSpot虚拟机对象内存布局采用三段式结构:对象头、实例数据和对齐填充。对象头包含Mark Word(存储锁状态、hashcode等运行时数据)和Klass Pointer(指向类元数据),数组对象还包含长度字段。64位JVM默认开启压缩指针优化,对象头为12字节。实例数据按类型宽度降序排列以优化内存使用,字段偏移量在类加载时确定。对齐填充确保对象整体大小是8字节的倍数。JDK新版本逐步优化了字段布局算法,并引入了紧凑对象头(Lilliput项目)以减少内存占用。不同锁状态下访问hashcode的代价存

文章不设任何条件,如果文章被系统设为VIP可见请联系我修改 508

UG NX二次开发(C#)--详细讲述编程模板NXOpen_CS_Wizard的代码意义,帮你轻松进入NXOpen(C#)二次开发

有几个读者私信问我,在看了“NX1957在VS2019上二次开发的环境配置”后,能完成了UG NX二次开发(C#)模板的配置,也能根据模板创建工程,但是对工程文件.cs不甚理解;并且,在UG Styler新建完成后,其也有一个dlx文件和.cs文件,也不清楚怎么使用。本文先对UG NX二次开发(C#)模板文件进行讲解,在下一个博客中,讲解Styler新建后的模板文件。以上就是对编程模板NXOpen_CS_Wizard(c#)的讲解,其实只要明白了逻辑关系,编程实现只是时间问题,祝你好运。

GimiGimmy 1786

yolov5改进之Fasternet主干网络替换

fasternet替换yolov5主干网络

qq_41920323的博客 5144

java kv对象_java对象在Art中的表示

// art/runtime/mirror/object.h// Fields within mirror objects aren't accessed directly so that the appropriate amount of// handshaking is done with GC (for example, read and write barriers). This macr...

weixin_39783915的博客 183

AUTOSAR从入门到精通-【应用实战篇】车载HMI-ADAS

ADAS是高级驾驶辅助系统(Advanced Driving Assistance System)简称ADAS。ADAS高级驾驶辅助系统是利用安装于车上的各式各样的传感器, 在第一时间收集车内外的环境数据, 进行静、动态物体的辨识、侦测与追踪等技术上的处理, 从而能够让驾驶者在最快的时间察觉可能发生的危险, 以引起注意和提高安全性的主动安全技术。

lin_xiu的博客 1435

Android ART函数抽取壳原理与实现:从Dex保护到运行时修复

在Android应用安全领域,加壳技术是保护代码逻辑的核心手段。其基本原理是通过对Dex文件进行加密或混淆,防止逆向工程直接分析关键代码。随着Android Runtime(ART)的引入,传统的整体加密方案面临兼容性挑战,促使技术向更精细化的函数级保护演进。函数抽取壳作为一种高级保护方案,通过有选择性地抽空关键方法的字节码指令,仅在运行时动态解密和填充,实现了对核心逻辑的隐蔽保护。这种技术不仅提升了应用的安全性,还能有效对抗静态分析和动态调试。在实际工程中,实现函数抽取壳需要深入理解ART虚拟机的类加载、

weixin_30613433的博客 405

【数据集2】CPC Global Unified Temperature/Precipitation数据简介及处理

简介CPC 温度及降雨 数据

WW、forever的博客 3107

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Android 内存管理全景指南:从底层机制到亿级用户应用优化实践

摘要:本文深入剖析Android内存管理的系统化方法论,从ART虚拟机底层机制到亿级应用实战案例。首先解析内存分区模型、垃圾回收算法和分配机制的技术原理,揭示内存泄漏7种形态及检测工具链;其次提出编码层优化四大原则和架构层解决方案;最后通过电商、社交、视频三领域实战案例展示优化效果。文章还前瞻Android14内存标签等新技术趋势,强调建立"预防-检测-优化-监控"完整链路的重要性,指出在大模型时代下内存管理的新挑战与平衡之道。

weixin_37794278的博客 1683

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

The Book of QT4 翻译:1.2 布局,对象层级和内存管理

The Book of QT4 翻译:1.2 布局,对象层级和内存管理 作者:mcxiaoke  来源:博客园  发布时间:2010-05-12 10:57  阅读:651 次  原文链接   [收藏]   The Book of QT4 翻译 QT程序设计艺术 ----------------------------------------------------

hqyhqyhq的专栏 1096

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Android Runtime数据类型转换与内存管理源码剖析(65)

Android Runtime(ART)是Android系统中应用运行的核心环境,其架构设计对数据类型转换与内存管理起着决定性作用。ART采用AOT(Ahead - Of - Time)编译技术,在应用安装时将字节码编译为机器码,相比早期的Dalvik虚拟机,显著提升了应用的执行效率。

Android开发领域创作者 1664

android 内存优化_Android内存优化大盘点

本文作者作者:Stan_Z链接:https://www.jianshu.com/p/fba7b43bdc9c本文由作者授权发布。做内存优化的同学有福了,不过文章知识点依然硬核,能啃多少是多少吧,其他性能优化相关文章:吹爆系列:深入探索Android卡顿优化吹爆系列:深入探索Android布局优化大科普吹爆系列:深入探索 Android 包体积优化吹爆系列:深入探索Android稳定性优化...

weixin_39574555的博客 404
上一篇: C++11笔记
下一篇: ART中的内联函数笔记
Viewz
博客等级 码龄9年 309粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值