结构体的使用与内存计算/对齐数计算

简介: (1)平台原因:不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常(2)性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。

目录

前言:


结构体的声明


1.例如定义一个学生类型


2. 可以在大括号后面定义结构体变量(s1,s2,s3)---全局变量


3.struct前加typedef时


4.结构体的自引用


5.结构体嵌套初始化


结构体的内存对齐---计算结构体的内存大小


1.为什么要内存对齐?


2.如何计算结构体所占内存大小?


3.什么是对齐数


4.计算结构体所占内存实例讲解


计算如下:(用语言可能难理解 我这里画图)


前言:

结构体实质上就是一种类型 类似与int char等,但是是自己创建的一种类型

结构体的声明

1.例如定义一个学生类型

44043021a62b6042a1fb417173c4ddd2_b262de0e0c8840fc974c9aaa47829939.png


2. 可以在大括号后面定义结构体变量(s1,s2,s3)---全局变量

344f896b691f17ba033ca9e06ac82c18_ef02ad823a0f432aa58b1cf7db8cd78c.png

3.struct前加typedef时

可以用括号后面所写的代替struct Stu :例如:s1与s2的定义

24321a7a53bb5170123e2bf46c9c75da_719c2f28754f4563a6428031b9816836.png

4.结构体的自引用

注意箭头

8b000691c3f9a15f74c6fd83de917b03_d5d42782c20e4b979fc73e544339d0d8.png



5.结构体嵌套初始化

63e7e98d545d76d8051cbbfa232c9642_3f34ffa5365949dfa303a22ab1354b1a.png

结构体的内存对齐---计算结构体的内存大小

1.为什么要内存对齐?

(1)平台原因:

不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特

定类型的数据,否则抛出硬件异常

(2)性能原因:

数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。


总结:结构体的内存对齐是拿空间来换取时间的做法


2.如何计算结构体所占内存大小?

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

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

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

   VS中默认的值为8

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

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

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


3.什么是对齐数

例如一个int类型的对齐数为4 double的对齐数位8 char的对齐数位1 但是在结构体储存的时候会选择类型对齐数与编译器的默认对齐数中小的:

fe4d2326ecefa5c41b350040fa9d838d_ee4cb8e255d8499ab762387e1da5e577.png

4.计算结构体所占内存实例讲解

计算下面3个结构体所占内存大小

de350f30586b716991af7477c95b22c1_3b98e50b17a04294a8477f6c939d5068.png

计算如下:(用语言可能难理解 我这里画图)

9f8df45f021763e0b7a8cbcc404d56aa_146d068f19ae4b35a1b2580b0ffb8cec.png

1bc916fd579c15472722c630d13354f3_d3b1f05e73484e37b0417c3afad898df.png



大家懂了吧!!!


目录
相关文章
|
6月前
|
存储 安全 数据库
阿里云服务器计算型、通用型、内存型主要实例规格性能特点和适用场景汇总
阿里云服务器ECS计算型、通用型、内存型规格族属于独享型云服务器,在高负载不会出现计算资源争夺现象,因为每一个vCPU都对应一个Intel ® Xeon ®处理器核心的超线程,具有性能稳定且资源独享的特点。本文为大家整理汇总了阿里云服务器ECS计算型、通用型、内存型主要实例规格族具体实例规格有哪些,各个实例规格的性能特点和主要适用场景。
阿里云服务器计算型、通用型、内存型主要实例规格性能特点和适用场景汇总
|
2月前
|
存储 C语言
C语言如何使用结构体和指针来操作动态分配的内存
在C语言中,通过定义结构体并使用指向该结构体的指针,可以对动态分配的内存进行操作。首先利用 `malloc` 或 `calloc` 分配内存,然后通过指针访问和修改结构体成员,最后用 `free` 释放内存,实现资源的有效管理。
163 13
|
2月前
|
存储 编译器 数据处理
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
74 11
|
2月前
|
编译器 Go
探索 Go 语言中的内存对齐:为什么结构体大小会有所不同?
在 Go 语言中,内存对齐是优化内存访问速度的重要概念。通过调整数据在内存中的位置,编译器确保不同类型的数据能够高效访问。本文通过示例代码展示了两个结构体 `A` 和 `B`,尽管字段相同但排列不同,导致内存占用分别为 40 字节和 48 字节。通过分析内存布局,解释了内存对齐的原因,并提供了优化结构体字段顺序的方法,以减少内存填充,提高性能。
45 3
|
2月前
|
存储 Java 程序员
结构体和类的内存管理方式在不同编程语言中的表现有何异同?
不同编程语言中结构体和类的内存管理方式既有相似之处,又有各自的特点。了解这些异同点有助于开发者在不同的编程语言中更有效地使用结构体和类来进行编程,合理地管理内存,提高程序的性能和可靠性。
33 3
|
2月前
|
存储 缓存 Java
结构体和类在内存管理方面的差异对程序性能有何影响?
【10月更文挑战第30天】结构体和类在内存管理方面的差异对程序性能有着重要的影响。在实际编程中,需要根据具体的应用场景和性能要求,合理地选择使用结构体或类,以优化程序的性能和内存使用效率。
|
2月前
|
存储 缓存 算法
结构体和类在内存管理方面有哪些具体差异?
【10月更文挑战第30天】结构体和类在内存管理方面的差异决定了它们在不同的应用场景下各有优劣。在实际编程中,需要根据具体的需求和性能要求来合理选择使用结构体还是类。
|
7月前
|
弹性计算 安全 前端开发
阿里云服务器ECS通用型、计算型和内存型详细介绍和性能参数表
阿里云ECS实例有计算型(c)、通用型(g)和内存型(r)三种,主要区别在于CPU和内存比例。计算型CPU内存比1:2,如2核4G;通用型为1:4,如2核8G;内存型为1:8,如2核16G。随着技术迭代,有第五代至第八代产品,如c7、g5、r8a等。每代实例在CPU型号和主频上相同,但性能有所提升。实例性能参数包括网络带宽、收发包能力、连接数等。具体应用场景如计算型适合高网络包收发、通用型适合企业级应用,内存型适合内存数据库等。详细信息可参阅阿里云ECS页面。
400 0
|
6月前
|
存储 缓存 安全
阿里云服务器实例规格选择参考:经济型、通用算力型、计算型、通用型、内存型区别
当我们在通过阿里云的各种活动选择云服务器实例规格的时候会发现,相同配置的云服务器往往有多个不同的实例可选,而且价格差别也比较大,这会是因为不同实例规格的由于采用的处理器不同,底层架构也有所不同(例如X86 计算架构与Arm 计算架构),因此不同实例的云服务器其性能与适用场景是有所不同。目前阿里云的活动中,主要的实例规格可分为经济型、通用算力型、计算型、通用型、内存型,对于很多初次接触阿里云服务器的用户来说,了解他们之间的差别就是比较重要的了,下面小编来为大家简单介绍下它们之间的区别。
阿里云服务器实例规格选择参考:经济型、通用算力型、计算型、通用型、内存型区别
|
5月前
|
存储 Go
Go 内存分配:结构体中的优化技巧
Go 内存分配:结构体中的优化技巧

热门文章

最新文章