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

简介: (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



大家懂了吧!!!


目录
相关文章
|
7月前
|
安全 C++
【自定义类型:结构体,枚举,联合】内存对齐的原理和原因
【自定义类型:结构体,枚举,联合】内存对齐的原理和原因
56 0
|
17天前
|
存储 编解码 安全
阿里云服务器计算型c7与c8y、通用型g7与g8y、内存型r7与r8y区别及选择参考
在阿里云目前的活动中,除了轻量应用服务器和经济型e、通用算力型u1实例的云服务器之外,性能更高的云服务器实例规格有计算型c7与c8y、通用型g7与g8y、内存型r7与r8y,这些实例规格更适合企业级用户的上云需求,有的用户并不是很清楚他们之间的区别,从而不知道应该如何选择,本文就为大家介绍一下他们之间的区别,以供选择参考。
阿里云服务器计算型c7与c8y、通用型g7与g8y、内存型r7与r8y区别及选择参考
|
1月前
|
机器学习/深度学习 人工智能 自动驾驶
内存计算为边缘人工智能提供动力,并加速制造业效率
内存计算为边缘人工智能提供动力,并加速制造业效率
|
7月前
|
存储 编译器 C语言
结构体类型的结构在内存的存储
结构体类型的结构在内存的存储
|
3月前
|
C语言
C语言结构体传值和传址及内存使用
C语言结构体传值和传址及内存使用
12 0
|
4月前
|
存储 缓存 资源调度
阿里云购买云服务器选择经济型、通用算力型、计算型、通用型、内存型实例参考
在我们通过阿里云的活动选购云服务器的时候会发现,相同配置的云服务器往往有多个不同的实例可选,而且价格差别也比较大,这会是因为不同实例规格的由于采用的处理器不同,底层架构也有所不同(例如X86 计算架构与Arm 计算架构),因此不同实例的云服务器其性能与适用场景是有所不同。本文为大家详细介绍阿里云的经济型、通用算力型、计算型、通用型和内存型实例的性能特点及适用场景,以供大家选择参考。
阿里云购买云服务器选择经济型、通用算力型、计算型、通用型、内存型实例参考
|
4月前
|
存储 机器学习/深度学习 人工智能
阿里云倚天云服务器计算型c8y、通用型g8y、内存型r8y实例性能介绍及活动价格参考
计算型c8y、通用型g8y、内存型r8y是阿里云推出的基于ARM架构的新一代阿里自研倚天实例,采用阿里自研倚天710处理器,基于最新一代CIPU架构,通过芯片快速路径加速手段实现计算、存储、网络性能的大幅提升。其中计算型c8y实例网站应用、各种类型和规模的企业级应用,通用型g8y实例适用于网站应用、各种类型和规模的企业级应用,内存型r8y实例适用于网站应用、各种类型和规模的企业级应用。本文为大家详细介绍倚天云服务器实例的主要性能和最新活动价格情况。
阿里云倚天云服务器计算型c8y、通用型g8y、内存型r8y实例性能介绍及活动价格参考
|
4月前
|
存储 弹性计算 安全
阿里云七代云服务器计算型c7、通用型g7、内存型r7实例性能介绍及活动价格参考
阿里云第7代云服务器主要实例规格包括计算型c7、通用型g7、内存型r7,其中计算型c7实例适用于计算密集型业务,如Web服务器Apache、Nginx等场景,通用型g7实例适用于通用业务,如网站应用、各类企业级应用、中间件,内存型r7实例适用于内存密集型业务,如数据库系统、缓存、搜索集群。本文为大家详细介绍七代云服务器实例的主要性能和最新活动价格情况。
阿里云七代云服务器计算型c7、通用型g7、内存型r7实例性能介绍及活动价格参考
|
5月前
|
存储 编译器 C语言
自定义类型:结构体(自引用、内存对齐、位段(位域))
自定义类型:结构体(自引用、内存对齐、位段(位域))
|
5月前
|
存储 编译器 C语言
c语言进阶部分详解(详细解析自定义类型——结构体,内存对齐,位段)
c语言进阶部分详解(详细解析自定义类型——结构体,内存对齐,位段)
43 0