当前位置: 首页 > news >正文

揭秘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语言结构体,为你的编程之路增添亮丽的一笔。

相关文章:

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

揭秘C语言结构体&#xff1a;通往内存对齐的视觉之旅 引言 在C语言的编程旅程中&#xff0c;结构体&#xff08;structs&#xff09;是一个关键而强大的概念。结构体不仅允许我们组织和存储不同类型的数据&#xff0c;而且通过深入了解内存对齐&#xff0c;我们可以更好地优化…...

java中可重入锁的作用是什么?

可重入锁的主要作用是允许同一个线程在持有锁的情况下多次进入同步代码块或方法&#xff0c;而不会被阻塞。这样做的主要目的是为了简化编程模型&#xff0c;增强程序的灵活性&#xff0c;并避免死锁的发生。 1. 简化编程模型&#xff1a; 可重入锁使得同一个线程在执行临界区…...

适合炎热天气的最佳葡萄酒有哪些?

每年的夏天&#xff0c;白葡萄酒和玫瑰红葡萄酒总会是葡萄酒爱好者的首选&#xff0c;这是为什么呢&#xff1f;随着春天的逝去&#xff0c;夏天悄悄地到来&#xff0c;空气变得炎热和沉重&#xff0c;树木变得越来越郁郁葱葱&#xff0c;白天的时间更长而晴朗了。多雨的五月变…...

软件工程 课后题 选择 查缺补漏

在一张状态图中只能有一个初态&#xff0c;而终态则可以没有&#xff0c;也可以有多个 所有的对象可以成为各种对象类&#xff0c;每个对象类都定义了一组 方法 通过执行对象的操作可以改变对象的属性&#xff0c;但它必须经过 消息 的传递 UML应用于 基于对象的面向对象的方…...

PyQt基础_011_对话框类控件QMessage

基本功能 import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5.QtWidgets import *class WinForm( QWidget): def __init__(self): super(WinForm,self).__init__() self.setWindowTitle("QMessageBox") self.resize(300, 100) self.myButt…...

SpringMvc集成开源流量监控、限流、熔断降级、负载保护组件Sentinel | 京东云技术团队

前言&#xff1a;作者查阅了Sentinel官网、51CTO、CSDN、码农家园、博客园等很多技术文章都没有很准确的springmvc集成Sentinel的示例&#xff0c;因此整理了本文&#xff0c;主要介绍SpringMvc集成Sentinel SpringMvc集成Sentinel 一、Sentinel 介绍 随着微服务的流行&…...

[LeetCode] 12. 整数转罗马数字

12. 整数转罗马数字 罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 …...

深入了解Java Period类,对时间段的精确控制

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概2900多字&#xff0c;预计阅读时间长需要3分钟。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&#x…...

企业软件的分类有哪些|app小程序定制开发

企业软件的分类有哪些|app小程序定制开发 企业软件是指为了满足企业运营和管理需求而开发的软件系统。根据不同的功能和应用领域&#xff0c;企业软件可以分为以下几个分类&#xff1a; 1. 企业资源计划&#xff08;Enterprise Resource Planning&#xff0c;ERP&#xff09;软…...

选择更好的Notes索引附件方式

大家好&#xff0c;才是真的好。 首先介绍最近产品更新消息。在上一周&#xff0c;HCL主要发布了以下几个产品更新&#xff1a;HCL Verse 3.2.0、HCL Volt MX Go 2.0.2、HCL Domino Rest API 1.0.8。 HCL Verse是今后Domino的产品当中主要使用的webmail功能&#xff0c;这一次…...

Vue混淆与还原

Vue混淆与还原 引言 Vue是一种流行的JavaScript框架&#xff0c;用于构建用户界面。它简单易用且功能强大&#xff0c;备受开发者喜爱。然而&#xff0c;在传输和存储过程中&#xff0c;我们需要保护Vue代码的安全性。混淆是一种有效的保护措施&#xff0c;可以加密和压缩代码…...

R语言单因素方差分析+差异显著字母法标注+逐行详细解释

R语言单因素方差分析 代码如下 df <- read.csv("data.csv",header TRUE,row.names 1) library(reshape2) df <- melt(df,idc()) names(df) <- c(trt, val) df aov1 <- aov(val~trt,datadf) summary(aov1)library(agricolae) data <- LSD.test(aov…...

linux 消息队列apache-activemq服务的安装

1.下载 官网下载地址&#xff1a;https://activemq.apache.org/ 操作如下&#xff1a; 2. 解压 执行&#xff1a;tar -zxvf apache-activemq-5.18.3-bin.tar.gz -C /user/ 3. 进入目录 执行&#xff1a;cd /user/apache-activemq-5.18.3 4.修改配置文件 执行&#xff1…...

前端数据加密相关问题

什么是数据加密&#xff1f; 数据加密是一种安全性技术&#xff0c;通过使用算法将明文转换为密文&#xff0c;以保护数据的保密性和完整性。数据加密通常用于保护机密信息&#xff0c;例如个人身份、财务信息、企业机密等。在数据传输过程中&#xff0c;数据可以被拦截或窃听…...

Vue3中reactive和ref对比

Vue3中reactive和ref对比 数据角度对比原理角度对比使用角度对比 数据角度对比 ref用来定义: 基本类型reactive用来定义: 对象(或数组)类型数据备注:ref也可以定义对象或数组类型数据,它内部会调用reactive转为代理对象. 原理角度对比 ref通过Object.defineProperty()中的ge…...

【尘缘送书第五期】Java程序员:学习与使用多线程

目录 1 多线程对于Java的意义2 为什么Java工程师必须掌握多线程3 Java多线程使用方式4 如何学好Java多线程5 参与方式 摘要&#xff1a;互联网的每一个角落&#xff0c;无论是大型电商平台的秒杀活动&#xff0c;社交平台的实时消息推送&#xff0c;还是在线视频平台的流量洪峰…...

Linux C语言 34-库封装操作

Linux C语言 34-库封装操作 本节关键字&#xff1a;C语言 封装库 动态库 相关C库函数&#xff1a; 什么是库&#xff1f; 库是现成的&#xff0c;可以复用的代码。从本质上看&#xff0c;库是一种可执行代码的二进制形式&#xff0c;可以被操作系统载入内存执行。在C语言的编…...

JavaWeb-Tomcat

1. Web服务器 web服务器由硬件和软件组成&#xff1a; 硬件&#xff1a;计算机系统软件&#xff1a;计算机上安装的服务器软件&#xff0c;安装后可以为web应用提供网络服务。 常见的JavaWeb服务器&#xff1a; Tomcat&#xff08;Apache&#xff09;&#xff1a;应用最广泛的…...

k8s之Pod常用命令详解、镜像拉取策略(imagePullPolicy)

常用命令 kubectl api-resources #查询可操作的资源对象列表kubectl get pod #查看默认命名空间下所有pod kubectl describe pod podname #获取默认命名空间下POD详情# 如果要查看制定命名空间则使用 -n nsname kubectl get pod -n ns kubectl describe pod podname -n ns# 以Y…...

Spark低版本适配Celeborn

Spark-3.5版本以下使用Celeborn时&#xff0c;无法使用动态资源&#xff0c;对于低版本的Spark&#xff0c;Celeborn提供了patch。各版本patch如下 https://github.com/apache/incubator-celeborn/tree/main/assets/spark-patch 下载patch&#xff0c;这里下载spark-3版本&am…...

W5500 TCP客户端实战:从寄存器配置到网络调试助手,手把手打通第一个连接

W5500 TCP客户端开发实战&#xff1a;从硬件连接到数据交互的全流程解析 第一次接触W5500芯片时&#xff0c;我盯着数据手册里密密麻麻的寄存器描述发呆了半小时——网关地址、子网掩码、Socket模式...这些概念对嵌入式开发者来说既熟悉又陌生。本文将带你用最直观的方式理解W…...

告别黑盒操作:详解mmc_utils在Android设备上的20+个实用命令(从extcsd读到RPMB写)

eMMC深度操作指南&#xff1a;解锁mmc-utils的20个高阶应用场景 当你的Android设备出现存储性能下降、分区异常或安全验证需求时&#xff0c;系统自带的工具往往束手无策。此时&#xff0c;一个被低估的神器mmc-utils正躺在Linux内核源码树中等待被唤醒——它不仅能够读取eMMC芯…...

Windows下用CMake和MinGW编译NLopt 2.6.2的完整指南(附测试代码)

Windows平台下NLopt 2.6.2源码编译与实战应用全解析 在科学计算与工程优化领域&#xff0c;NLopt作为一款开源的非线性优化库&#xff0c;因其丰富的算法支持和跨平台特性而广受欢迎。本文将深入探讨如何在Windows系统中从零开始构建NLopt 2.6.2开发环境&#xff0c;并通过完整…...

AI编程专栏(三) - Cursor 高级技巧与实战优化

1. Cursor高级功能深度解析 第一次接触Cursor时&#xff0c;你可能觉得它就是个带AI的代码编辑器。但当我真正用它完成一个企业级项目后&#xff0c;才发现那些藏在深处的功能才是真正的生产力神器。比如最近在重构一个老旧的React项目时&#xff0c;通过合理使用MCP协议&#…...

SmallThinker-3B部署实录:在16GB内存笔记本上稳定运行长链推理服务

SmallThinker-3B部署实录&#xff1a;在16GB内存笔记本上稳定运行长链推理服务 1. 环境准备与快速部署 想要在普通笔记本上运行大模型推理服务&#xff1f;SmallThinker-3B-Preview让你用16GB内存就能实现这个目标。这个模型基于Qwen2.5-3b-Instruct微调而来&#xff0c;专门…...

AI显微镜-Swin2SR保姆级教程:一键修复模糊图片详细步骤

AI显微镜-Swin2SR保姆级教程&#xff1a;一键修复模糊图片详细步骤 1. 项目简介 你是否遇到过这样的困扰&#xff1a;手机里存着多年前的老照片&#xff0c;画质模糊看不清细节&#xff1b;或者从网上下载的图片分辨率太低&#xff0c;放大后全是马赛克&#xff1f;传统的图片…...

Janus-Pro-7B在SolidWorks设计中的应用:工程问题智能答疑

Janus-Pro-7B在SolidWorks设计中的应用&#xff1a;工程问题智能答疑 1. 引言 想象一下这个场景&#xff1a;你正在用SolidWorks赶一个复杂的装配体设计&#xff0c;突然卡在了一个配合关系上&#xff0c;或者对某个特征的生成顺序拿不准。这时候&#xff0c;你是去翻几百页的…...

从Bootloader到App的优雅跳转:关键步骤与实战解析

1. 为什么需要Bootloader跳转App&#xff1f; 在嵌入式开发中&#xff0c;Bootloader和App的关系就像电脑的BIOS和操作系统。Bootloader负责硬件初始化、固件更新等底层工作&#xff0c;而App则是实现具体业务逻辑的主程序。两者分工明确&#xff0c;但最终需要无缝衔接。 我遇…...

Mamba模型实战:如何用Python快速搭建一个长序列处理Demo(附代码)

Mamba模型实战&#xff1a;如何用Python快速搭建一个长序列处理Demo&#xff08;附代码&#xff09; 在自然语言处理和时间序列分析领域&#xff0c;处理长序列数据一直是个棘手的问题。传统Transformer架构虽然表现出色&#xff0c;但随着序列长度增加&#xff0c;其计算复杂度…...

OpenClaw备份恢复:Qwen3-VL:30B飞书配置迁移指南

OpenClaw备份恢复&#xff1a;Qwen3-VL:30B飞书配置迁移指南 1. 为什么需要备份恢复OpenClaw配置 上周我的主力开发机突然硬盘故障&#xff0c;导致所有数据丢失。最让我头疼的不是代码仓库——它们都有远程备份&#xff0c;而是那套精心调校的OpenClaw飞书助手配置。这个助手…...