揭秘C语言结构体:通往内存对齐的视觉之旅

揭秘C语言结构体:通往内存对齐的视觉之旅

引言

在C语言的编程旅程中,结构体(structs)是一个关键而强大的概念。结构体不仅允许我们组织和存储不同类型的数据,而且通过深入了解内存对齐,我们可以更好地优化程序性能。在这篇博客文章中,我们将全面研究C语言结构体,包括定义、变量创建、初始化,以及内存对齐等方面。通过丰富的图示和深入的代码解读,我们将带你深入探索这一重要的数据结构。

1. 结构体类型的定义

首先,我们需要了解如何定义一个结构体类型。结构体类型是用户自定义的数据类型,通过struct关键字实现。下面是一个简单的例子:

struct Stu 
{char name[50];int age;float height;
};

Stu结构体包含了姓名、年龄和身高三个成员。

2. 结构体变量的创建与初始化

结构体类型定义后,我们可以创建相应的结构体变量,并进行初始化。以下是一个例子:

#include <stdio.h>
struct Stu
{char name[20];//名字int age;//年龄char sex[5];//性别char id[20];//学号
};
int main()
{//按照结构体成员的顺序初始化struct Stu s = { "张三", 20, "男", "20230818001" };printf("name: %s\n", s.name);printf("age : %d\n", s.age);printf("sex : %s\n", s.sex);printf("id : %s\n", s.id);//按照指定的顺序初始化struct Stu s2 = { .age = 18, .name = "lisi", .id = "20230818002", .sex = "⼥printf("name: %s\n", s2.name);printf("age : %d\n", s2.age);printf("sex : %s\n", s2.sex);printf("id : %s\n", s2.id);return 0;
}

3.内存对齐:程序性能的守护者

内存对齐对于提高程序性能至关重要。它确保结构体中的每个成员从其大小的倍数地址开始存储,以最小化内存访问时间。

3.1 对齐规则

首先得掌握结构体的对齐规则:

  1. 结构体的第⼀个成员对齐到和结构体变量起始位置偏移量为0的地址处
  2. 其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。
    对齐数 = 编译器默认的⼀个对⻬数 与 该成员变量大小的较小值。
    (VS 中默认的值为 8)
  3. 结构体总大小为最⼤对齐数(结构体中每个成员变量都有⼀个对齐数,所有对齐数中最大的 整数倍。
  4. 如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最大对齐数的整数倍处,结构 体的整体大小就是所有最⼤对齐数(含嵌套结构体中成员的对齐数)的整数倍。

3.2练习

typedef struct {int a;char b;short c;short d;
}AA_t;int main()
{printf("%d\n", sizeof(AA_t));return 0;
}

在这里插入图片描述

#include <stdio.h>
union Un
{short s[7];int n;
};
int main()
{printf("%d\n", sizeof(union Un));return 0;
}

在这里插入图片描述

4.实际案例:取消内存对齐

#include <stdio.h>struct PackedData {char a;int b;char c;
} __attribute__((packed));int main() {struct PackedData packedStruct;printf("PackedData的大小:%zu 字节\n", sizeof(packedStruct));return 0;
}

通过上面的代码,我们演示了如何通过__attribute__((packed))取消结构体的内存对齐,进而影响结构体的大小。

5.结论

通过这篇博客的全方位解读,你应该对C语言中的结构体有了更深入的了解。从定义到初始化,再到内存对齐,我们用图解和案例为你展现了结构体的方方面面。希望这篇文章能够帮助你更好地掌握C语言结构体,为你的编程之路增添亮丽的一笔。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/205230.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python+requests+unittest+excel实现接口自动化测试框架

在刚刚进入测试行业的时候&#xff0c;最开始也是做功能测试&#xff0c;我想很多伙伴和我一样&#xff0c;觉得自动化测试都很高端&#xff0c;很神秘。迫不及待的想去学习作自动化测试。 以前比较常用数据库python做自动化&#xff0c;后面发现excel个人觉得更加适合&#x…

初始类与对象

初始类与对象 实验介绍 本课程是进一步对类与对象的深入认识&#xff0c;如何定义并实例化一个类&#xff0c;介绍如何使用 C 标准库 string 类等。 知识点 认识类与对象内联函数string 类类的定义与实例化 认识类与对象 官方定义 类&#xff1a;在面向对象编程中是一种…

总结1077

这两天复习强度大&#xff0c;复习到头疼了。昨天复习了6h的数学&#xff0c;晚上头疼的睡不着觉。今日情况也好不到哪去。 数学这门&#xff0c;完全被整慌了。从做模拟卷的情况看&#xff0c;效果比做真题差许多。怕被打击到&#xff0c;也没算分。就这一门没复习好&#xf…

自定义starter案例——统计独立IP访问次数

自定义starter案例——统计独立IP访问次数 文章目录 自定义starter案例——统计独立IP访问次数ip计数业务功能开发定时任务报表开发使用属性配置功能设置功能参数配置调整 自定义拦截器开启yml提示功能 ip计数业务功能开发 public class IpCountService {private Map<String…

matplot函数调整子图大小测试

调整subplot()函数的子图间距 import numpy as np import matplotlib.pyplot as plt for i in range(1,7):figsize 10,6plt.subplot(2,3,i)plt.text(0.5,0.5,str((2,3,i)),fontsize18,hacenter) **plt.subplots_adjust(hspace3.3, wspace0.3)** plt.show()import numpy as np…

水果党flstudio用什么midi键盘?哪个版本的FL Studio更适合我

好消息&#xff01;好消息&#xff01;特大好消息&#xff01; 水果党们&#xff01;终于有属于自己的专用MIDI键盘啦&#xff01; 万众期待的Novation FLKEY系列 正式出炉&#xff01; 话有点多话&#xff0c;先分享一份干货&#xff0c;尽快下载 FL Studio 21 Win-安装包&…

2023人工智能和市场营销的融合报告:创造性合作的新时代需要新的原则

今天分享的人工智能系列深度研究报告&#xff1a;《2023人工智能和市场营销的融合报告&#xff1a;创造性合作的新时代需要新的原则》。 &#xff08;报告出品方&#xff1a;M&CSAATCHITHINKS&#xff09; 报告共计&#xff1a;11页 生成型人工智能的兴起和重要性 生成式…

美易投资:股价低于1美元的美股数量激增,低价股会下跌成趋势?

随着疫情的蔓延和股市的波动&#xff0c;越来越多的美股股价低于1美元&#xff0c;这一现象引起了市场的广泛关注。低价股数量的激增是否会逆势下跌成为市场趋势&#xff0c;这是投资者们需要思考的问题。 首先&#xff0c;我们需要了解股价低于1美元的背后原因。一方面&#x…

深入探讨Redis高可用性解决方案:Sentinel与Cluster对比

目录 引言 Redis Sentinel&#xff1a;监控与故障切换 工作原理 关键特点 Redis Cluster&#xff1a;分布式与自动化 工作原理 关键特点 对比与选择 架构差异 配置差异 自动化程度 适用场景 结语 引言 在构建可靠的分布式系统中&#xff0c;Redis作为一种高性能的…

P8 Linux 目录操作

目录 前言 01 mkdir 系统调用 mkdir的代码示例 02 rmdir删除目录 03 打开、读取以及关闭目录 3.1 opendir()函数原型&#xff1a; 04 读取目录 readdir() 05 struct dirent 结构体&#xff1a; 06 rewinddir ()函数重置目录流 07 关闭目录 closedir ()函数 测试:打印…

IT基础监控方案:5台服务器和20台网络设备监控

一、项目背景与目标 随着中小企业业务的快速发展&#xff0c;网络设备数量不断增加&#xff0c;运维工作面临巨大挑战。为了提高网络设备运行稳定性、降低故障风险并实现高效管理&#xff0c;本方案旨在建立一个基础监控与管理的平台&#xff0c;实现对5个服务器和20多个网络设…

基于深度学习的遥感图像变化差异可视化系统

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 遥感图像变化差异可视化是遥感图像处理和分析的重要研究领域之一。随着遥感技术的快速发展和遥感数据的广泛应用&#xff0c;遥感图像的获取和处理变得越来越容易…

英伟达显卡系列与架构、代表产品

主要系列 1、GeForce系列&#xff1a; GeForce系列是NVIDIA最主要的消费者显卡系列&#xff0c;用于游戏和娱乐。包括不同性能水平的产品&#xff0c;从入门级到高端。 2、Quadro系列&#xff1a; Quadro系列是专业级别的显卡&#xff0c;主要用于专业图形工作站&#xff0c;…

【LeeCode】1.两数之和

给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回…

os.popen()返回值带有换行

merge_base os.popen(git merge-base origin/master HEAD) merge_base_commit_id merge_base.read() print(merge_base_commit_id )输出&#xff1a; xxxxxxxxxxxx所以merge_base_commit_id的真实值其实是‘xxxxxxxxxxxx\n’&#xff0c;如果作为变量被使用应该去掉最后的换…

python-比较Excel两列数据,并分别显示差异

利用 openpyxl 模块&#xff0c;操作Excel&#xff0c;比较Excel两列数据&#xff0c;并分别显示差异 表格数据样例如下图 A&#xff0c;B两列是需要进行比较的数据&#xff08;数据源为某网站公开数据&#xff09;&#xff1b;C&#xff0c;D两列是比较结果的输出列 A&#…

【SA8295P 源码分析】137 - 车载以太网协议学习总结(待更新......)

【SA8295P 源码分析】137 - 车载以太网协议学习总结 一、Ethernet 以太网介绍1.1 实效性:AVB(Audio Video Bridging)/ TSN(Time-Sensitive Networking)1.1.1 Synchronization:同步,协议(802.1AS)1.1.2 Latency:低延迟,协议(802.1Qav、802.1Qbu、802.1Qbv、802.1ch、…

【RabbitMQ高级功能详解以及常用插件实战】

文章目录 队列1 、Classic经典队列2、Quorum仲裁队列 队列 classic经典队列&#xff0c;Quorum仲裁队列&#xff0c;Stream流式队列 1 、Classic经典队列 这是RabbitMQ最为经典的队列类型。在单机环境中&#xff0c;拥有比较高的消息可靠性。 在RabbitMQ中&#xff0c;经典…

小白学习java理解栈手写栈——第四关(青铜挑战)

内容1.理解栈的基本特征2.理解如何使用数组来构造栈3.理解如何使用链表来构造栈 1.栈的基础知识 1.1栈的特征 栈和队列是比较特殊的线性表&#xff0c;又称为访问受限的线性表。栈是很多表达式、符号等运算的基础&#xff0c;也是递归的底层实现&#xff0c;理论上递归能做的…