深度理解C语言六——结构体内存对齐和结构体所占内存空间的大小

简介: 深度理解C语言六——结构体内存对齐和结构体所占内存空间的大小

本篇文章我们深入讨论一个问题:计算结构体的大小。

这里就涉及到结构体内存对齐,这个对齐规则是什么呢?带着这个问题,我们先来看一个示例:

这个代码是计算这个结构体所占内存的大小的,按照我们平时的思维,char占一个字节,int占四个字节,所以这个结构体应该是1+4+1=6个字节,我们来看一下运行结果是什么。

运行结果居然是12,这和我们预期的不一样,说明我们想错了,看来结构体的内存大小和一般的变量确实不一样。

下面来介绍一下结构体的对齐规则:


第一个成员在与结构体变量偏移量为0的地址处。

其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。

对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。

(VS中默认的值为8)

结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍。

如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整

体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。

这些话很难理解,我们就通过上面这个示例代码来解释一下上面的话。

这样存储难免有空间的浪费。

还有结构体嵌套时的内存大小,我们来看这个例子:

运行结果为:

我们来看一下为什么是这样,嵌套结构体的运算规则是:嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。


本篇文章内容结束,感谢大家观看。如果意见或建议,可以在评论区留言,您的点赞是我更新的动力。我们下篇文章再见。

目录
相关文章
|
3天前
|
存储 开发框架 .NET
"揭秘.NET内存奥秘:从CIL深处窥探值类型与引用类型的生死较量,一场关于速度与空间的激情大戏!"
【8月更文挑战第16天】在.NET框架中,通过CIL(公共中间语言)可以深入了解值类型与引用类型的内存分配机制。值类型如`int`和`double`直接在方法调用堆栈上分配,访问迅速,生命周期随栈帧销毁而结束。引用类型如`string`在托管堆上分配,堆栈上仅存储引用,CLR负责垃圾回收,确保高效且自动化的内存管理。
16 6
|
5天前
|
C语言
C语言------选择结构
这篇文章是C语言选择结构的入门实训,包括多个练习题及其源代码,旨在帮助读者熟练掌握条件语句和选择结构程序设计方法,并熟悉switch语句和程序调试过程。
C语言------选择结构
|
5天前
|
存储 程序员 C语言
【C语言】动态内存管理
【C语言】动态内存管理
|
11天前
|
存储 编译器 C语言
C++内存管理(区别C语言)深度对比
C++内存管理(区别C语言)深度对比
38 5
|
11天前
|
C语言
C语言动态内存管理
C语言动态内存管理
19 4
|
25天前
|
Java fastjson C++
JVM内存问题之JVM中元空间持续增长并且GC无法释放的原因可能是什么
JVM内存问题之JVM中元空间持续增长并且GC无法释放的原因可能是什么
|
1月前
|
存储 缓存 C语言
【C语言】字符函数,字符串函数,内存函数
C语言中的字符串函数和内存函数
24 0
【C语言】字符函数,字符串函数,内存函数
|
1月前
|
运维 DataWorks 安全
DataWorks产品使用合集之如何查看空间资源、CPU、内存和存储空间容量
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
11天前
|
存储 Go
Go 内存分配:结构体中的优化技巧
Go 内存分配:结构体中的优化技巧
|
1月前
|
机器学习/深度学习 分布式计算 大数据
MaxCompute产品使用合集之如何查看空间资源、CPU和内存以及存储空间容量
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。