专栏名称: 嵌入式微处理器
关注这个时代最火的嵌入式微处理器,你想知道的都在这里。
目录
相关文章推荐
哈尔滨日报  ·  平山神鹿滑雪场、冰雪乐园明日闭园 ·  昨天  
哈尔滨日报  ·  16岁学生签约做主播被索赔30万!合同有效吗? ·  2 天前  
新闻夜航  ·  低至200元!价格“大跳水”! ·  3 天前  
哈尔滨日报  ·  亚冬会:黑龙江运动员贡献中国金牌超4成 ·  3 天前  
51好读  ›  专栏  ›  嵌入式微处理器

为什么你写的代码占用内存这么大?

嵌入式微处理器  · 公众号  ·  · 2024-03-14 15:35

正文

你做的模块,测试反馈说,进去就卡顿,按钮点击半天才反应。


这是为什么呢?


要想知道这个问题的答案,首先需要搞懂怎样估算对象和结构体的大小。


一、如何估算结构体的大小?


结构是值类型,它的结构体的实例是存放在栈中或者堆中。


结构体在内存中所占的大小,就是其字段所占的大小,但是,它的大小并不是所有字段大小相加, 而是存在一个对齐的规则 ,在默认的对齐规则中,基本类型字段是按照自身大小对齐的,如byte是按1字节对齐。


struct A  {    byte a1;  }


如上面这个 结构体的大小就是1字节 ,如果是下面这个:


struct A{  byte a1;  int a2;}


这个结构体所占 内存大小是8字节 ,因为int是4字节对齐的,所以只能从第四个字节开始。


如果再添加一个字段:


struct A{byte a1;int a2;byte a3;}


这个结构体大小是12 ,由于struct本身也要是对齐的,所以它的对齐规则是按照其中元素最大的对齐规则决定的。也就是说上面这个结构体要按照4字节对齐, 不足4字节要补齐,所以是12个字节大小


如果想要优化它的大小,可以调整顺序如下:


struct A{  byte a1;  byte a3;  int a2;}


这个时候这个 结构体所占的大小就是8字节 了。


二、如何估算类的大小?


类是引用类型,它的对象实例存放在堆中,对象实例一定是会占用堆内存的,而在栈中,保存的是实例的引用。对象在堆中分成3个区域,vtable、monitor和字段。


其中vtable是类的共有数据,包含静态变量和方法表,这个应该就是类本身所占用的大小和具体的对象无关。monitor是线程同步用的,这2个指针分别占用一个inptr.Size大小,字段是从第9个字节或17个字节开始的,字段的对齐规则和结构体的对齐规则相同,区别是Mono中对象的实例会把引用类型的引用放在最前面。一个对象实例的大小就是 inptr.Size *2+字段的大小。


通过调整字段的顺序,也可以优化对象的大小。


还可以通过StructLayoutAttribute自定义类和结构体的对齐方式。


[StructLayout(LayoutKind, Sequential, Pack = 1)]public struct A {  byte a1;  int a2;  byte a3; }


上面这个结构体强制按照1字节对齐, 所以他的大小是6字节 ,但这样做可能会降低性能。


所以具体情况还是要具体分析,懂得了如何估算结构体和类的大小,就更容易知道该如何使用它们了。


我们的目标就是让测试下岗,因为没有BUG他就没工作了。


END

来源:IT档案馆

版权归原作者所有,如有侵权,请联系删除。

推荐阅读
Linux中国宣布停止运营!






请到「今天看啥」查看全文