如何估算结构体和类的大小

你做的模块,测试反馈说,进去就卡顿,按钮点击半天才反应。
这是为什么呢?
要想知道这个问题的答案,首先需要搞懂怎样估算对象和结构体的大小。
一、如何估算结构体的大小
结构是值类型,它的结构体的实例是存放在栈中或者堆中。
结构体在内存中所占的大小,就是其字段所占的大小,但是,它的大小并不是所有字段大小相加,而是存在一个对齐的规则,在默认的对齐规则中,基本类型字段是按照自身大小对齐的,如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他就没工作了。


高压放大器是工作原理和功能支持-Pintech品致
光纤通信传输设备有哪些?传输光纤经过哪些设备?
“芯星计划”启动仪式暨大学生半导体行业就业研讨会成功举办
钢轮式耐磨试验机的技术参数
一文搞懂电感Isat、Irms以及测量方法
如何估算结构体和类的大小
CBA推聊天机器人 能处理200余种业务
对探索蛋白质折叠有了全新远景!
《2022中国低压电器市场白皮书》进行解析
中京电子:惠州PCB制造基地订单比较饱满 HDI/FPC产品订单排期紧张
四维图新将携手合作伙伴让车路协同覆盖更多城市
如何在面包板上构建一个简单的FM收音机接收器
LCD与OLED的详细解读
中微半导体带你见证国产功率半导体崛起
坐标机器人的特点_坐标机器人的应用
腾讯官方公布封测时间:游戏业务将登陆Android和iOS平台
卷积神经网络判读与分类视网膜眼底成像技术再获突破
长安欧诺的CX7,7座SUV配置强劲,不仅外观精美,售价也仅售6万
铝基板与FR-4 PCB线路板的区别
在RISC架构嵌入式平台上实现简单的无线可视电话设计