当前位置: 首页 > news >正文

C语言之结构体内存的计算

结构体的内存

一.提出疑问

     结构体占用的是一片连续的内存空间,大小是由成员变量的类型决定的。但并不是计算所有成员变量的类型大小之和那么简单。

先举一个实例:

struct student {int age; //4个字节int telephone;  //4个字节
};
int main()
{struct student s;//      s的字节为8;printf("%d", sizeof(s));return 0;
}

如图,结构体student中含有2个int类型成员变量,代码运行后,可知结构体的大小为8个字节。

可真的是因为两个成员变量的大小之和嘛?

我们再来一个实例:

struct student {int age; //4个字节char name; //1个字节int telephone;  //4个字节
};
int main()
{struct student s;//      s的字节为12;printf("%d", sizeof(s));return 0;
}

图中的三个成员变量分别为 int,char,int类型,三个成员变量的内存相加为9个字节

可为什么结构体内存会等于12呢?

 很明显结构体内存大小 不等于 所有成员变量的内存大小之和

二.计算结构体内存大小

在计算结构体内存大小时,我们得先学会一个规则-----对齐规则。

1. 第一个成员在与结构体变量偏移量为0的地址处
2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处
     对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
      (VS中默认的值为8)
3. 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍
4. 如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整
体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

理论已出,现在来实践计算一下:

struct student {int age; //1个字节char name; //1个字节int telephone;  //4个字节
};
int main()
{struct student s;//      s的字节为12;printf("%d", sizeof(s));return 0;
}

例如以上代码,借助图 解释:

 

 解释思路:

  1.  首先根据规则,第一个成员得在地址为0处,然后成员的内存大小为4个字节,所以占用4个空间,地址0~3
  2. 第二个成员变量得开始遵循对齐规则,由于char为1个字节,所以无论地址为多少,都是1的整数倍,也占用一个空间,地址4
  3. 最后,第三个成员为int类型,此时地址已经到达了4的位置,而现在需要对齐int类型4个字节的整数倍,则需要从8开始,直到占有4个空间,地址8~11
  4. 结束:结构体总大小为最大对齐数(成员变量的内存)的整数倍,而该结构体的最大的内存类型为int 4个字节,而此时使用的内存0~11,则是12,满足条件。

 注:若是不满足时,则需要往后扩充,直到满足为止。

 创作不易,路过的帅哥美女,动动小手,点点赞咯,蟹蟹啦

                                                                              若文章有问题,请指出,虚心接受批评

http://www.lryc.cn/news/7639.html

相关文章:

  • Java网络编程之UDP和TCP套接字
  • Linux进程信号产生以及捕捉
  • 11. GLSL(OpenGL Shader Language)常用知识点汇总
  • 转发一张网络工程师考试的试卷2021.5.15
  • AMD发布23.2.1 新驱动 支持开年新作《魔咒之地》
  • 开放平台如何做接口的签名和加解密?
  • Mr. Cappuccino的第40杯咖啡——Kubernetes之Pod生命周期
  • 记一次OOM
  • idea插件生成dao类service类controller类以及mapper.xml
  • DML 数据操作语言
  • PySpark实战一之入门
  • 【DockerCE】Docker-CE 23.0.1正式版发布
  • vscode开发的Vue家用电器维修服务系统nodejs+mysql
  • PyQt5数据库开发1 4.2 配置SQL Server 2008 数据源(ODBC编程)
  • 【JavaEE】多线程代码实例:单例模式与阻塞队列BlockingQueue
  • 算法思想 - 搜索算法
  • C#底层库--日期扩展类(上周、本周、明年、前年等)
  • 如何在 Webpack 中开启图片压缩
  • Web-Filter
  • 测试写文章自动保存
  • 云平台搭建实例
  • 【Airplay_BCT】关于Bonjour的概念解答
  • C++深入浅出(九)—— 多态
  • shell学习4
  • VR全景行业的应用价值如何呈现?
  • ESP-IDF:TCP多线程并发服务器
  • Springboot扩展点之SmartInitializingSingleton
  • 基于linux内核的驱动开发学习
  • python3 django gunicorn
  • 专家分享 | 租赁型售楼处标准化示范区提效研究