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

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 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()还原默认对齐数

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

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
21天前
|
安全 编译器 Linux
【c语言】轻松拿捏自定义类型
本文介绍了C语言中的三种自定义类型:结构体、联合体和枚举类型。结构体可以包含多个不同类型的成员,支持自引用和内存对齐。联合体的所有成员共享同一块内存,适用于判断机器的大小端。枚举类型用于列举固定值,增加代码的可读性和安全性。文中详细讲解了每种类型的声明、特点和使用方法,并提供了示例代码。
19 3
|
1月前
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
43 3
|
1月前
|
存储 Prometheus NoSQL
大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
24 3
|
1月前
|
存储 编译器 Linux
C语言——自定义类型
C语言——自定义类型
|
1月前
|
数据采集 监控 Java
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
本文是关于SpringBoot日志的详细教程,涵盖日志的定义、用途、SLF4J框架的使用、日志级别、持久化、文件分割及格式配置等内容。
128 0
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
|
2月前
|
Kubernetes API Docker
跟着iLogtail学习容器运行时与K8s下日志采集方案
iLogtail 作为开源可观测数据采集器,对 Kubernetes 环境下日志采集有着非常好的支持,本文跟随 iLogtail 的脚步,了解容器运行时与 K8s 下日志数据采集原理。
|
1月前
|
Python
log日志学习
【10月更文挑战第9天】 python处理log打印模块log的使用和介绍
30 0
|
1月前
|
C语言
教你快速理解学习C语言的循环与分支
教你快速理解学习C语言的循环与分支
15 0
|
1月前
|
存储 编译器 C语言
【C语言】自定义类型:联合与枚举的简明概述
【C语言】自定义类型:联合与枚举的简明概述
|
1月前
|
C语言 C++
C语言 之 内存函数
C语言 之 内存函数
33 3