首页 > 系统相关 >Unity引擎字符串内存布局

Unity引擎字符串内存布局

时间:2024-07-31 15:18:17浏览次数:12  
标签:8Bytes Unity LENGTH 内存 字符串 length STACK size

    Unity引擎的字符串有三种存储方式:

  • 堆 : 分配在堆上
  • 内嵌 : 一个栈上的内存数据。 默认25字节,可以放长度最多24的字符串。这个长度定义为STACK_LENGTH.  
  • 外部
    重点主要是前两种,这是一种优化方法,对于非常短的字符串,可以直接使用栈数据而不需要再次内存分配。C++伪代码看起来像这样:
 union
 {
     char stack_buffer[STACK_LENGTH];
     
     struct Data
     {
         char* data; // 8Bytes
         size_t capacity; // 8Bytes
         size_t length; // 8Bytes
         
         // align 8Bytes for Data  
         // or size of stack string length (STACK_LENGTH - length)
     } // 32Bytes

 } // 32Bytes
 
 uint8_t dataType; // 8Bytes, 指出存储方式,其中7个Bytes用于对齐
  
 {
    Id : 4Bytes
    Salt    : 4Bytes
    Index : 4Bytes
 }MemoryTag; // 12Bytes

      所以要逆向一个unity的C++字符串数据,首先定位地址。然后尝试找到dataType,其方式为:*(unit8_t*)(ptr + 0x20)。

  • 如果是0,那么字符串就是*(const char**)(ptr);
  • 如果是1,那么字符串就是(const char*)(ptr)。

      字符串长度也有两种方式存放。

  • 如果是1,那么长度以(STACK_LENGTH-length)的形式保存在stack_buffer[STACK_LENGTH]这个位置上,这个值不会超过一个字节。这种情况要获取字符串长度需要通过STACK_LENGTH减去该值得到。
  • 如果不是1,那么长度就是Union当中的length。

      除此之外,Unity还有一个类似于C++的string_view的东西,它将字符串以视图的形式传递,可以有效避免一些不必要的内存分配与拷贝。

{  
   const char* data;  
   size_t size;  
}  

      对于这种情况,对象地址就是字符串地址,其长度位于 ptr + 0x8的位置上。

 

标签:8Bytes,Unity,LENGTH,内存,字符串,length,STACK,size
From: https://www.cnblogs.com/bodong/p/18334720

相关文章

  • P3501 [POI2010] ANT-Antisymmetry 反对称 题解(字符串哈希+二分)
    原题题意若一个由010101组成的字符串将000和......
  • JVM内存结构划分
    JVM内存结构划分JVM(Java虚拟机)的内存结构主要划分为以下几个部分:堆(Heap)概述:堆是JVM中最大的一块内存区域,用于存储对象实例和数组。堆内存是垃圾收集器管理的主要区域,因此也被称为“GC堆”。细分:堆内存可以分为年轻代(YoungGeneration)和老年代(OldGeneration)。年轻代又进一......
  • JVM内存区域的划分
    程序计数器程序计数器是一块较小的内存空间,它可以看作当前线程所执行的字节码的行号指示器,在虚拟机的概念模型中,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖于程序计数器来完成。......
  • 学习笔记 String类案例练习 1.模拟用户登录 2.统计字符串英文字母大小写及数字个数
    目录案例一模拟用户登录需求:代码: 案例二统计字符串英文字母大小写及数字个数需求:代码:案例一模拟用户登录需求:已知正确的用户名和密码,请用程序实现模拟用户登录。总共给三次机会,登录之后,给出相应的提示代码:publicstaticvoidmain(String[]args){......
  • JVM内存结构划分
    栈"栈"(Stack)是一种遵循后进先出(LastInFirstOut,LIFO)原则的抽象数据类型。以下是栈的一些基本特点和操作:特点:LIFO原则:最后加入栈的元素将是第一个被移除的元素。动态大小:栈的大小可以根据需要动态变化。线性结构:元素存储在栈中的方式是线性的,但只能从一端(栈顶)访问。基......
  • C/C++ 字符串常量的注意事项
    在C/C++中使用字符串常量时,需要注意以下几个关键点,以确保代码的正确性和高效性:存储位置:字符串常量通常存储在只读存储区(如文本段),这意味着它们不能被修改。尝试修改字符串常量将导致未定义行为,通常是程序崩溃。类型:在C中,字符串常量的类型是char数组的形式,但其末尾自动......
  • Leetcode每日一题 20240727 3106.满足约束且字典序最小的字符串
    题目描述给你一个字符串s和一个整数k。定义函数distance(s1,s2),用于衡量两个长度为n的字符串s1和s2之间的距离,即:字符‘a’到‘z’按循环顺序排列,对于区间[0,n-1]中的i,计算所有「s1[i]和s2[i]之间最小距离」的和。例如,distance(“ab”,......
  • 格式化字符串(summer2024_fmt)
    参考博客[参考博客]:https://blog.csdn.net/ysy___ysy/article/details/135700140[参考博客]:https://blog.csdn.net/2402_83422357/article/details/139180404戳此切大佬博客https://blog.csdn.net/Morphy_Amo/article/details/122215773https://blog.csdn.net/song_lee/......
  • 数组及数组JVM内存划分day4
    java中第一个存储数据的容器:数组特点:1、数组的长度大小是固定的2、同一个数组中,存储的元素数据类型是一样的数组的定义语句格式:数据类型[]数组名;举例:int[]arr;//定义了一个可以存储int类型的一维数组,数组名叫做arr......
  • 达梦数据库体系结构(物理结构、逻辑结构、内存结构、线程结构)
    达梦数据库体系结构(物理结构、逻辑结构、内存结构、线程结构) DM目录数据库安装目录下图展示为DM8数据库目录。  /dm8/bin 目录存放DM数据库的可执行文件,例如disql命令、dminit命令、dmrman工具等。  /dm8/desktop 存放DM数据库各个工具的桌面图标......