C语言进阶学习日志:自定义类型 (细中细)(上)

简介: C语言进阶学习日志:自定义类型 (细中细)

对于类型有这样的分法:

内置类型:

  1. char
  2. short
  3. int
  4. long
  5. long long
  6. float
  7. double

自定义类型:

  1. 结构体
  2. 枚举
  3. 联合


结构体:

当我们描述一个对象 但发现他有许多属性时 这时候这些属性就是结构体的成员变量 这些成员变量可以时不同的类型 也就时有着不同的属性

    经典的结构体是这样的
    struct stu //stu 是标签 因为有时我们需要用到多个结构体 那么标签就是为了区别他们
    {                  如果不要标签 那他就是匿名结构体 后面会说到
        memberlist 成员列表
    }variablelist 变量列表
     s1 s2 s3

如果你对把一个结构体赋值给另一个结构体 即使两个结构体成员变量相同 但他们时匿名结构体的话 那么是不可以的 因为编译器会认为你左右的两个类型时不同的

    定义的方法:
    struct stu
   {
      ~~~~~~
   }s1={~~~~};
   int main()
  { 
    struct stu s2={~~~~~~};
  }


结构体的内存对齐:

在了解结构体的内存对齐之前首先我们要知道一个 宏 offsetoff

0b404f0ed1c74260adeecb8366d0faf6.png

这个可以返回一个结构体成员在结构体里面偏移量的大小 记住他的头文集 <stddef.h>

    #include <stdio.h>
    #include <stddef.h>
    struct stu
    {
       char i;
       int c;
    }s1;
    int main()
    {
       printf("%d",offsetof(struct stu,i)); //0
       printf("%d",offsetof(struct stu,c)); //4
    }

 我们再定义一个结构体来解释这个现象

86895d356cfe44eb9c8abef2503c10ca.png

我们先看看内存对齐的规则

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

②其他成员变量(从第二个变量开始)要对齐到某个数字(对齐数)的整数倍的地址处

对齐数是编译器默认的一个对齐数 与 该成员大小的 最小值

  vs默认对齐数是 8

③结构体的总大小为最大对齐数的整数倍

④如果嵌套了结构体的情况 嵌套的结构体对齐到自己的最大对齐数的整数倍,结构体的整体大小就是所有最大对齐数(含嵌套结构体里面的对齐数)的整数倍

(linux没有默认对齐数 对齐数就是其自身的大小)

2ef2fff0aa70429cb3ab7d125fe42ff4.png

为什么存在内存对齐?

平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据;某些硬件平台只能再某些地址处去某些特定的类型数据

性能原因:数据结构(尤其是栈)应该尽可能的在自然边界上对齐

其实总的来讲内存对齐 就是 空间换时间的做法

同样默认对其数是可以修改的  使用  #pragma pack(8) 就可以修改默认对齐数为8

使用  #pragma pack()还原默认对齐数

其次对于结构体传参 还是传地址的要好

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
目录
相关文章
|
9月前
|
调度
FreeRTOS学习日志 - 第一天
这就是我的FreeRTOS学习日志 - 第一天的内容,明天继续探索这片实时操作系统的广阔海洋。+
182 12
|
数据采集 监控 Java
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
本文是关于SpringBoot日志的详细教程,涵盖日志的定义、用途、SLF4J框架的使用、日志级别、持久化、文件分割及格式配置等内容。
1021 2
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
|
安全 编译器 Linux
【c语言】轻松拿捏自定义类型
本文介绍了C语言中的三种自定义类型:结构体、联合体和枚举类型。结构体可以包含多个不同类型的成员,支持自引用和内存对齐。联合体的所有成员共享同一块内存,适用于判断机器的大小端。枚举类型用于列举固定值,增加代码的可读性和安全性。文中详细讲解了每种类型的声明、特点和使用方法,并提供了示例代码。
167 3
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
1486 3
|
存储 Prometheus NoSQL
大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
225 3
|
存储 编译器 Linux
C语言——自定义类型
C语言——自定义类型
|
Python
log日志学习
【10月更文挑战第9天】 python处理log打印模块log的使用和介绍
322 0
|
C语言
教你快速理解学习C语言的循环与分支
教你快速理解学习C语言的循环与分支
124 0
|
存储 编译器 C语言
【C语言】自定义类型:联合与枚举的简明概述
【C语言】自定义类型:联合与枚举的简明概述
162 0