学C的第三十天【自定义类型:结构体、枚举、联合】-1

简介: 1 . 结构体(1). 结构体的基础知识: 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。

1 . 结构体

(1). 结构体的基础知识:

           

结构一些值的集合,这些值称为成员变量

结构的每个成员可以是不同类型的变量

(2). 结构体的声明:

               

struct tag        

{                        

               member - list;

}variable - lest;

struct  --  结构体标签

tag  --  自定义结构名

 member - list  --  成员列表

variable - lest  --  结构体变量列表

实例:

image.png

(3). 特殊的声明:

             

匿名结构体:在声明结构时,可以不完全地声明,即声明时省略掉了结构体标签(tag)

                   

实例:

image.png

(4). 结构的自引用:

         

结构中包含一个类型为该结构本身的成员(类似递归?)

               

实例:


(5). 结构体变量的定义和初始化:

               

两种 定义 实例:


image.png

两种 初始化 实例:


image.png

结构体成员列表包含另一个结构体 实例

image.png

(6). 结构体内存对齐(重点):

             

运用于计算结构体大小

         

         

结构体的对齐规则:

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

                     

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

  • 对齐数 = 编译器默认的一个对齐数该成员大小 两者中的较小值
  • VS中默认的值为8,Linux中没有默认对齐数,对齐数就是成员自身的大小

                   

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

示例:

image.png

4. 如果嵌套了结构体的情况嵌套的结构体对齐到自己的最大对齐数的整数倍处结构体的整体大小就是所有最大对齐数含嵌套结构体的对齐数的整数倍

示例:

image.png4. 如果嵌套了结构体的情况嵌套的结构体对齐到自己的最大对齐数的整数倍处结构体的整体大小就是所有最大对齐数含嵌套结构体的对齐数的整数倍

示例:

(2). 性能原因:

数据结构(尤其是)应该尽可能地在自然边界上对齐

原因在于,为了访问未对齐的内存处理器需要作两次内存访问

对齐的内存访问仅需要一次访问

 

总体来说:

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

设计结构体的时候,我们既要满足对齐,又要节省空间

让占用空间小的成员尽量集中在一起          

相关文章
|
4月前
|
Linux C语言 C++
自定义类型——结构体、枚举和联合
自定义类型——结构体、枚举和联合
|
7月前
|
存储 编译器 Linux
自定义数据类型:结构体+枚举+联合
自定义数据类型:结构体+枚举+联合
|
存储
学C的第三十天【自定义类型:结构体、枚举、联合】-2
(7). 修改默认对齐数: 结构在对齐方式不合适的时候,我们可以自己更改默认对齐数。 使用 #pragma 预处理指令,修改默认对齐数
|
存储 编译器 Linux
自定义类型——结构体,枚举,联合
自定义类型——结构体,枚举,联合
|
编译器 C++
【学习笔记之我要C】自定义类型详解(结构体+枚举+联合)
【学习笔记之我要C】自定义类型详解(结构体+枚举+联合)
298 0
|
编译器 C++
自定义类型:结构体,枚举,联合 (1)
自定义类型:结构体,枚举,联合 (1)
72 1
|
编译器 C++
自定义类型:结构体,枚举,联合
自定义类型:结构体,枚举,联合
|
存储 编译器 C++
自定义类型:结构体,枚举,联合 (2)
自定义类型:结构体,枚举,联合 (2)
65 0
|
存储 安全 编译器
自定义类型:结构体,枚举,联合
自定义类型:结构体,枚举,联合
113 0
|
编译器 C++
自定义类型:结构体、枚举、联合
自定义类型:结构体、枚举、联合
61 0
自定义类型:结构体、枚举、联合