结构体内存对齐与位段

news2024/11/19 4:39:50

1.对齐规则:

1.结构体的第一个成员对齐到结构体变量的起始位置(偏移量为0处)。

2.其它成员要对齐到对齐数的整数倍的地址处(编译器默认对齐数(vs默认为8,gcc没有默认只看变量)与该成员变量所占字节的较小值。)

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

4.如果嵌套了结构,则该嵌套的结构体的最大对齐数是自己成员中最大对齐数的那一个的整数倍处。第3条规则就改为了还要看结构体里面的成员的最大对齐数,和非嵌套的那部分的成员,所有成员中对齐数最大的那一个

例子:

1.   

struct stu {

char c1;

char c2;

int n;

}

  

最终总共消耗了8个字节的空间,刚好是最大对齐数 4(int n存放对应的),所以如果用

sizeof(struct stu) 会等于8

2.

struct stu {

char c1;

int n;

char c2;

}

与刚刚那个略微有一点点不一样的是占了9个字节,不为4的整数倍,所以要转化为整数倍;所以

sizeof(struct stu)会等于12;


2.为什么要进行内存对齐?

2.1平台原因:

某些平台需要数据出现在特定的位置处;

2.2性能原因:

实际上就是一个空间换取时间的过程,32位的机器,一次就读取4个字节(32个bit),当你将结构体中的数据连续存放时,会出现   char int int int | int这种情况,需要重新再读取一遍前面的三个int,会降低性能,但是对齐的话,可以直接跳过,就能刚好读到起始的位置;

在上面的两个例子中可以得知,第二种浪费的空间就会比较多;所以,为了节省空间,我们在定义结构体的时候应该尽量让占空间小的变量集中在一起。


3.修改默认对齐数:

#pramga pack()想改多少就填多少


4.结构体的位段

注意的事项:

1.位段的成员必须是char(整型)  int  unsigned int或者signed int

2.位段是不跨平台的

struct stu {

int a:2;

int b:5;

int c:10;

int d:30;

};

冒号后面的代表需要多少个比特位;

4.1

位段的内存存放方式(vs x86环境下):

一开始先在01地址(假设)处生成一个int类型的的空间,首先分配2个比特的空间给a,再分配5个比特给b,接着再分配10个比特给c,现在就占了32个比特位中的17个比特了,已经放不下d的了,所以需要浪费这部分空间,在05地址处再生成一个新的int空间,同理分配30个空间;

4.2 

对不跨平台原因进行部分探究:

1.int在不进行位段的时候不会考虑有无符号整型(char正常也需要考虑),正常就是signed,但是在跨平台的时候就需要考虑这个问题;

2.不同平台对类型的字节设置是不同的;

3.位段中的成员在内存中是左到右还是右到左是不确定的;

4.位段在上面那个例子中int大于了剩余空间,是否会进行消耗,也是不确定的。

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

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

相关文章

text2sql方法:基于ChatGPT的zero-shot方法C3

ChatGPT SQL ChatGPT SQL出自2023年3月的论文《A comprehensive evaluation of ChatGPT’s zero-shot Text-to-SQL capability》(github),这篇论文分析了ChatGPT的text2sql能力,实验结果表明ChatGPT的text2sql能力令人印象深刻,虽然没有达到…

CK-G080AB低频RFID传感器|工业级读写器性能与接口说明

CK-G080AB 是一款基于射频识别技术的低频 RFID 标签传感器,传感器工 作频率为 125KHZ,同时支持对 EMID,FDX-B 两种格式标签的读取。传感器内部 集成了射频部分通信协议,用户只需通过 RS232\RS485 通信接口接收数据便能完 成对标签…

谷歌网站收录查询,帮助您快速准确地查询网站在谷歌的收录情况的3个方法

谷歌网站收录查询,帮助您快速准确地查询网站在谷歌的收录情况的3个方法。 一、使用GoogleSearchConsole(谷歌搜索控制台) 1.注册并验证网站 -首先,确保您的网站已注册并验证在GoogleSearchConsole中。这是一个免费的工具&…

VR全景摄影的商业模式及盈利点分析

VR全景摄影作为一种新兴的商业技术,其商业模式和盈利点主要体现在以下几个方面: 内容订阅与付费:企业可以通过提供VR全景内容平台,让用户通过订阅或单次购买来获得特定的VR全景内容,这类似于音乐和视频流媒体平台的运营…

Element UI教程:如何将Radio单选框的圆框改为方框

大家好,今天给大家带来一篇关于Element UI的使用技巧。在项目中,我们经常会用到Radio单选框组件,默认情况下,Radio单选框的样式是圆框。但有时候,为了满足设计需求,我们需要将圆框改为方框,如下…

如何通过开源工具帮助保护您的计算机安全

引言 如果您正在考虑安全问题,您有很多选择。随着当前网络犯罪的激增,以及发生犯罪时常见的重大后果,许多企业开始关注如何在网络世界中保护公民的安全。网络安全行业蕴藏着巨大的商业利益,但您可能会惊讶地发现,有一…

前端工程规范-5:Git提交信息规范(commitlint + czg)

前面讲的都是在git提交之前的一些检查流程,然而我们git提交信息的时候,也应该是需要规范的。直接进入主题: 目录 需安装插件清单commitlint 介绍安装配置配置commit-msg钩子提交填写commit信息czg后续方式一:push触动build并上传…

记一次vue-cli老项目的打包时长优化

记一次vue-cli老项目的打包时长优化 背景 这是一个基于 vue-cli 的 vue2 的老项目,比较久远,一般Jenkins中打包时间都在 5-6min 左右,基本能够接受。 近来由于项目原因,在该项目中加入了一些在打包时动态生成的js文件以做“缓存…

【SQL】笛卡尔积比较收入更高的员工

目录 语法 需求 示例 分析 代码 语法 FROM Employee a, Employee b 两个表之间笛卡尔积(Cartesian product)的形式,用了逗号分隔的连接(comma-separated join),这是早期SQL语法中用于连接表的一种方式…

从零开始学习OMNeT++系列第二弹——新建一个OMNeT++的工程

上一篇第一弹介绍了OMNeT是什么以及如何安装OMNeT,现在来说一下如何新建一个自己的OMNeT的工程。 在 Omnet安装完成后,samples/tictoc 中有该例子的完整文件,你可以立刻运行该文件看他是怎么工作的,不过更推荐按接下来的步骤一步…

[Notepad++] 文本编辑器的下载及详细安装使用过程(附有下载文件)

程序员常用的文本编辑器Notepad,用于修改配置文件等 下载链接在文末 下载压缩包后解压 !!安装路径不要有中文 解压文件,得到 双击exe文件 选择简体中文,点击OK 点击下一步 点击“我接受” 更改安装目录,不…

谷歌收录查询工具,如何选择适合自己的谷歌收录查询工具

搜索引擎优化(SEO)的实践中,了解网站在谷歌搜索引擎中的收录情况是一项至关重要的任务。这不仅能反映网站在谷歌搜索结果中的可见性,还能帮助SEO专业人士和网站所有者识别潜在的优化机会。 一、谷歌收录查询工具 1.GoogleSear…

通信工程学习:什么是CSMA/CA载波监听多路访问/冲突避免

CSMA/CA:载波监听多路访问/冲突避免 CSMA/CA(Carrier Sense Multiple Access/Collision Avoidance),即载波监听多路访问/冲突避免,是一种用于数据传输时避免各站点之间冲突的算法,尤其适用于无线局域网&…

基于springboot的评分评教管理系统

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1 、功能描述 基于springboot的评分评教管理系统1拥有三种角色 管理员:评价管理、学生管理、评分指标管理、课程管理、教师管理、管理员管理等教师:课程管理、学生管理、个人信…

ubuntu server 常用配置

这里写目录标题 0001 虚拟机静态IP0002 vim tab 4个空格0003 设置时区0004 网络端口查看端口开放端口 0005 修噶机主机名 0001 虚拟机静态IP win网络链接,IP地址:192.168.220.1 - NAT网关:192.168.220.2 - ubuntu静态IP设置: ca…

24年九月份生活随笔

九月份最后一天,烈士纪念日。 上午看了一会儿直播,庄重的仪式,铭记先辈为新中国抛头颅洒热血,当今盛世,如您所愿。 郑州马拉松官方通告,今天十点公布直通,中签,候补结果。 看完直…

算法:153.寻找旋转排序数组中的最小值

题目 链接:leetcode链接 思路分析(二分) 题目要求O(logN)的时间复杂度,那就必然是使用二分算法了。 怎么个二分呢? 首先,我们来寻找二段性 我们看示例一: 3,4,5&…

LeetCode 面试经典150题 172.阶乘后的零

题目:给定一个整数 n ,返回 n! 结果中尾随零的数量。 提示 n! n * (n - 1) * (n - 2) * ... * 3 * 2 * 1 思路: 代码: class Solution {public int trailingZeroes(int n) {return n 0 ? 0 : n / 5 trailingZeroes(n / 5);}…

Android-由switch-case和view.getId()引起的bug:错误:需要常量表达式 的解决办法

无意中,使用按钮测试点击事件,在此过程中使用了switch case语句,在条件switch中使用了view.getId(),出现错误。我记得很早之前写Android程序没啥问题,于是研究了一番。 度娘一番才知道,是因为R文件的缘故。…

【视频目标分割-2024CVPR】Putting the Object Back into Video Object Segmentation

Cutie 系列文章目录1 摘要2 引言2.1背景和难点2.2 解决方案2.3 成果 3 相关方法3.1 基于记忆的VOS3.2对象级推理3.3 自动视频分割 4 工作方法4.1 overview4.2 对象变换器4.2.1 overview4.2.2 Foreground-Background Masked Attention4.2.3 Positional Embeddings 4.3 Object Me…