0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

Q4MP_gh_c472c21 来源:IT档案馆 作者:IT档案馆 2022-10-13 13:40 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

这是为什么呢?

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

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

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

结构体在内存中所占的大小,就是其字段所占的大小,但是,它的大小并不是所有字段大小相加,而是存在一个对齐的规则,在默认的对齐规则中,基本类型字段是按照自身大小对齐的,如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他就没工作了。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内存
    +关注

    关注

    9

    文章

    3173

    浏览量

    76113
  • 对象
    +关注

    关注

    1

    文章

    38

    浏览量

    17674
  • 结构体
    +关注

    关注

    1

    文章

    131

    浏览量

    11299

原文标题:为什么你写的代码占用内存这么大?

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    C语言结构(struct)常见使用方法

    ; int c; }相应的,64位机按8字节对齐。不过对齐不是绝对的,用#pragma pack()可以修改对齐,如果改成1,结构大小就是实实在在的成员变量大小的总和了。和C++的
    发表于 08-23 18:18

    C++笔记004:C++通俗点说—— C结构复习

    ` 本帖最后由 tyyhmtyyhm 于 2018-5-12 09:37 编辑 C++通俗点说—— C结构复习核心:C++的就是对C语言的
    发表于 03-05 12:53

    漫谈C语言结构

    不是8 byte。  所以,结构成员变量的放置顺序影响着结构所占的内存空间的大小。一个结构
    发表于 11-15 15:59

    D功放的功耗估算

    各位大佬,如题,想问下D功放的功耗如何估算。比如TPA3255,48V供电,PBTL时,带负载2ohm。此时48V需要供电多少电流,TPA3255本身的功耗大概是多少?
    发表于 09-10 19:06

    消息队列传递结构指针和结构异同

    FreeRTOS消息队列 传递结构指针和结构异同1 消息队列传递结构指针和
    发表于 02-11 07:02

    C语言中创建一个结构其实际占用的内存空间大小是多少呢?

    际占用的内存空间大小是多少呢?示例代码如下:struct S{int i;char c;int j;};要正确计算结构大小,首先需要了解数据对齐的原理。数据对齐
    发表于 09-29 11:57

    结构的区别与联系

    是引用类型在堆上分配,的实例进行赋值只是复制了引用,都指向同一段实际对象分配的内存有构造和析构函数可以继承和被继承
    发表于 11-20 12:23 1.2w次阅读
    <b class='flag-5'>结构</b><b class='flag-5'>体</b>和<b class='flag-5'>类</b>的区别与联系

    用于OLAP的视图大小估算算法比较与分析

    OLAP系统中的视图物化操作,要求快速、可靠而精确。许多视图大小估算技术利用特定的统计假设,其误差可能较大。基于概率的估算方法在速度方面可能较慢,但是在估算大视图时精确度和可靠度较高,
    发表于 12-12 18:24 0次下载

    如何设计只有数据字段的结构

    之前写过一篇《如何设计一个C++的》,今天这里继续聊聊如何设计结构,注意本文不介绍在C++中结构
    的头像 发表于 08-23 09:37 1928次阅读
    如何设计只有数据字段的<b class='flag-5'>结构</b><b class='flag-5'>体</b>

    结构基本用法详解

      结构就是把相同或者不同类型的便利放到一起,这和C++中的很像,但没有c++那么复杂,C语言中的结构申明如下。
    的头像 发表于 02-15 14:52 1788次阅读

    结构大小的获取

    我们使用sizeof()函数来获取结构大小
    的头像 发表于 03-14 17:30 1502次阅读

    C语言计算结构占用的空间大小

    计算以下两个结构所占空间大小分别是多少?
    发表于 08-24 16:03 828次阅读

    经典 C 语言编程,结构和联合体如何共用?

    结构 结构占用的内存大小,首先和编译器的系统位数有关系,类似于CPU是 64 bits 还是 32 bits 的情形;其次,
    的头像 发表于 01-11 18:24 2177次阅读
    经典 C 语言编程,<b class='flag-5'>结构</b><b class='flag-5'>体</b>和联合体如何共用?

    你是否真的了解结构占用了多少字节?

    结构成员所占内存空间大小一般情况下,如果想知道结构成员的内存占用情况需要:1、先用结构
    的头像 发表于 06-04 08:04 1090次阅读
    你是否真的了解<b class='flag-5'>结构</b><b class='flag-5'>体</b>占用了多少字节?

    结构成员的顺序会影响结构大小

    相同的结构成员,如果把顺序调整一下,会不会影响结构大小? 答案是会的,这主要跟字节对齐有关。 比如这样的
    的头像 发表于 11-25 16:24 861次阅读