(c语言进阶)结构体内存对齐和修改默认对齐数

一.结构体内存对齐

结构体内存大小计算方法:

偏移量:是指某个成员在结构体中相对于结构体首地址的偏移字节数。在计算机中,结构体是一种自定义数据类型,它由多个不同类型的成员组成。每个成员在内存中的存储位置是连续的,而结构体本身在内存中的存储位置也是连续的。因此,计算某个成员的偏移量可以帮助我们更好地理解结构体在内存中的存储方式。 

 例一:

例二: 

 

例三: 

 例四:

 嵌套的结构体会对齐到自己的最大对齐数,结构体整体大小为所有元素对齐数的最大值的整数倍

 

二.为什么存在内存对齐 

 

 三.节省空间的方法

 四.修改默认对齐数

 

例一: 

修改前:

#include<stdio.h>
#include<stddef.h>
typedef struct S1
{int a;double b;
}S1;
int main()
{printf("%zu\n",offsetof(S1,a));printf("%zu\n", offsetof(S1,b));printf("%zu",sizeof(S1));return 0;
}

 

 修改后:

#include<stdio.h>
#include<stddef.h>
#pragma pack(4)
typedef struct S1
{int a;double b;
}S1;
#pragma pack()
int main()
{printf("%zu\n",offsetof(S1,a));printf("%zu\n", offsetof(S1,b));printf("%zu",sizeof(S1));return 0;
}

例二: 

修改前:

#include<stdio.h>
#include<stddef.h>
typedef struct S1
{int a;char b;double c;
}S1;
int main()
{printf("%zu\n",offsetof(S1,a));printf("%zu\n", offsetof(S1,b));printf("%zu\n", offsetof(S1,c));printf("%zu",sizeof(S1));return 0;
}

修改后: 

#include<stdio.h>
#include<stddef.h>
#pragma pack(1)
typedef struct S1
{int a;char b;double c;
}S1;
#pragma pack()
int main()
{printf("%zu\n",offsetof(S1,a));printf("%zu\n", offsetof(S1,b));printf("%zu\n", offsetof(S1,c));printf("%d",sizeof(S1));return 0;
}

 

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

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

相关文章

【c】有序数列插入一个整数

#include<stdio.h> int main() {int n;scanf("%d",&n);int arr[n1];for(int i0;i<n;i){scanf("%d",&arr[i]);}int a;scanf("%d",&a);arr[n]a;for(int j0;j<n;j){if(arr[j]>arr[n])//交换元素位置{int temparr[j];arr…

2023.12.3 关于 Spring 拦截器 和 过滤器

目录 引言 Spring 拦截器实现 实例理解 Spring 过滤器实现 实例理解 拦截器和过滤器的区别 出身不同 触发时机不同 底层实现不同 支持的项目类型不同 使用场景不同 引言 原生 Spring AOP 实现统一拦截有两个难点难点一&#xff1a;定义拦截规则表达式 难点二&#…

CefSharp 获取POST(AJAX)、GET消息返回值(request)

CefSharp作为专门为爬虫工具开发的库比Selenium这种开发目的是页面测试工具然后用来做爬虫的工具要贴心得多。我们操作网页的时候发送或者做了某个动作提交表单之后需要知道我们的动作或者提交是否成功&#xff0c;因为有的页面会因为网络延迟问题提交失败&#xff0c;需要准确…

VSCode 开发C/C++实用插件分享——koroFileHeader

相关文章 VSCode 开发C/C实用插件分享——codegeex VSCode 开发C/C实用插件分享——koroFileHeader 一、koroFileHeader二、使用步骤1.安装2.头文件注释配置3.函数注释配置 一、koroFileHeader 在有些场景下&#xff0c;我们需要在文件头添加一些作者、文件描述、时间和版权描述…

12月第一天,给搞电商的家人们整活儿!

今年&#xff0c;大家出门的热情直线飙升&#xff01; 特种兵旅游带火N个小众城市、Citywalk大军激活大街小巷的商业活力、线下演出火爆带动各地文旅指数狂飙&#xff0c;户外运动也乘风而上&#xff0c;徒步/露营/钓鱼/骑行/冲浪/滑雪等花式运动在各大社媒平台集中刷屏&#…

pytorch 常用api笔记

view_as()函数 函数定义&#xff1a;view_as(tensor) [参数为一个Tensor张量] 该函数的作用是将调用函数的变量&#xff0c;转变为同参数tensor同样的形状。 例子 data1 [[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 0], [10, 11]]] t1 torch.Tensor(data1).long() # size2…

vue3 vue-cropper@next 实现图片裁切功能

Vue Cropper 实现上传图片预览&#xff0c;裁切上传效果 下载 pnpm add vue-croppernext使用 <template><inputref"inputRef"class"hidden"accept".png,.jpeg,.jpg"multipletype"file"change"handleUploadChange&quo…

使用Redis构建简易社交网站(2)-处理用户关系

目的 本文目的&#xff1a;实现用户关注和取消关注功能。&#xff08;完整代码附在文章末尾&#xff09; 相关知识 在我之前的文章 《使用Redis构建简易社交网站(1)-创建用户与动态界面》中提到了如何实现简易社交网站中创建新用户和创建新动态功能。 那这篇文章将教会你掌…

03 数仓平台 Kafka

kafka概述 定义 Kafka 是一个开源的分布式事件流平台&#xff08;Event Streaming Plantform&#xff09;&#xff0c;主要用于大数据实时领域。本质上是一个分布式的基于发布/订阅模式的消息队列&#xff08;Message Queue&#xff09;。 消息队列 在大数据场景中主要采用…

电压驻波比

电压驻波比 关于IF端口的电压驻波比 一个信号变频后&#xff0c;从中频端口输出&#xff0c;它的输出跟输入是互异的。这个电压柱波比反映了它输出的能量有多少可以真正的输送到后端连接的器件或者设备。

ffmpeg 任意文件读取漏洞/SSRF漏洞 (CVE-2016-1897/CVE-2016-1898)

漏洞描述 影响范围 FFmpeg 2.8.x < 2.8.5FFmpeg 2.7.x < 2.7.5FFmpeg 2.6.x < 2.6.7FFmpeg 2.5.x < 2.5.10 漏洞环境及利用 搭建docker环境 访问8080端口看到上传界面 由于vulhub并没有讲述该漏洞如何复现&#xff0c;我们需要进入环境查看源码 <?php if(!…

Motion Plan之轨迹生成笔记 (2)

Motion Plan之搜索算法笔记 Motion Plan之基于采样的路径规划算法笔记 Motion Plan之带动力学约束路径搜索 什么是基于优化的轨迹生成 Optimization-Based Trajectory Planning&#xff08;基于优化的轨迹规划&#xff09;是一种常用的方法&#xff0c;用于生成自动化系统&am…