C语言结构体对齐
1. 结构体对齐
要点
- 变量只能存储在他的长度的整数倍地址上
- 结构体整体对齐跟他的最长的字段整数倍对齐
栗子1
struct Example1 {char a; //1个字节int c; //4个字节short b; //2个字节
};std::cout << sizeof(Example1 ) << std::endl; // 12
std::cout << alignof(Example1) << std::endl; // 4
int只能存储的内存序号:0,4,8,12,...
short只能存储的内存序号:0,2,4,6,...
内存序号 | 存储大小 |
---|---|
0 | char-a |
1 | null |
2 | null |
3 | null |
4 | int-c |
5 | int-c |
6 | int-c |
7 | int-c |
8 | short-b |
9 | short-b |
现在a、c、b
三个变量总共占了10个字节,但是遵循第二点结构体整体对齐跟他的最长的字段的整数倍对齐,所以结构体总体应该是int=4的倍数,也就是4,8,12...
因此,最后这个结构体的大小是12个字节。对代码进行调试,监视内存窗口可以看到:
2. pack
要点
- 变量只能存储在他的min(长度,pack)的整数倍地址上
- 结构体整体对齐跟他的min(最长的字段,pack)整数倍对齐
栗子2
#pragma pack(2)
struct Example2 {char a; //1个字节int c; //4个字节short b; //2个字节
};std::cout << sizeof(Example2) << std::endl; // 8
std::cout << alignof(Example2) << std::endl; // 2
int原来只能存储的内存序号:0,4,8,12,...
->因为min(4, 2) = 2, 现在变成0,2,4,6,...
short还是只能存储的内存序号:0,2,4,6,...
内存序号 | 存储大小 |
---|---|
0 | char-a |
1 | null |
2 | int-c |
3 | int-c |
4 | int-c |
5 | int-c |
6 | short-b |
7 | short-b |
现在a、c、b
三个变量总共占了8个字节,但是遵循第二点结构体整体对齐跟他的min(最长的字段,pack)整数倍对齐,所以结构体总体应该是pack = 2的倍数,也就是2,4,6,8,...
因此,最后这个结构体的大小是8个字节。
对阿秀网站栗子上的解释
C++八股基础语法02
要点
- 变量只能存储在他的长度的整数倍地址上
- 结构体整体对齐跟他的最长的字段整数倍对齐
// alignas 生效的情况struct Info {uint8_t a; //1个字节uint16_t b; //2个字节uint8_t c; //1个字节
};std::cout << sizeof(Info) << std::endl; // 6个字节
std::cout << alignof(Info) << std::endl; // 2
uint8_t只能存储的内存序号:0,1,2,3,...
uint16_t只能存储的内存序号:0,2,4,6,...
内存序号 | 存储大小 |
---|---|
0 | uint8_t -a |
1 | null |
2 | uint16_t-b |
3 | uint16_t-b |
4 | uint8_t-c |
null代表内存填充为空
现在a、b、c
三个变量总共占了5个字节,但是遵循第二点结构体整体对齐跟他的最长的字段整数倍对齐,所以结构体总体应该是uint16_t
大小的倍数,也就是2,4,6,8,...
因此,最后这个结构体的大小是6个字节。
3. alignas与alignof
c++11以后引入两个关键字 alignas 与 alignof 。其中alignof可以计算出类型的对齐方式,alignas可以指定结构体的对齐方式。
要点
- 变量只能存储在他的长度的整数倍地址上【这一点和普通版没有任何区别】
- 结构体整体对齐跟他的
max(最长的字段,alignas指定长度)
整数倍对齐
因为alignas只能指定比默认值,也就是结构体最长字段,更大的值。所以对齐大小要么是默认值,要么是比默认值大的值
struct alignas(4) Info2 {uint8_t a; //1uint16_t b; //2uint8_t c; //1
};std::cout << sizeof(Info2) << std::endl; // 8 4 + 4
std::cout << alignof(Info2) << std::endl; // 4
uint8_t只能存储的内存序号:0,1,2,3,...
uint16_t只能存储的内存序号:0,2,4,6,...
内存序号 | 存储大小 |
---|---|
0 | uint8_t -a |
1 | null |
2 | uint16_t-b |
3 | uint16_t-b |
4 | uint8_t-c |
现在a、b、c
三个变量总共占了5个字节,但是遵循第二点结构体整体对齐跟他的max(最长的字段,alignas指定长度)
整数倍对齐,所以结构体总体应该是alignas = 4
大小的倍数,也就是4,8,...
因此,最后这个结构体的大小是8个字节。
后面几个调试的例子运行结果如图:
相关文章:
C语言结构体对齐
1. 结构体对齐 要点 变量只能存储在他的长度的整数倍地址上结构体整体对齐跟他的最长的字段整数倍对齐 栗子1 struct Example1 {char a; //1个字节int c; //4个字节short b; //2个字节 };std::cout << sizeof(Example1 ) << std::endl; // 12 std::cout &…...
Bootstrap系列之导航
Bootstrap导航 可以在 ul 元素上添加 .nav类,在每个 li 选项上添加 .nav-item 类,在每个链接上添加 .nav-link 类: 基本的导航 <div class"container mt-3"><h2>导航</h2><p>简单的水平导航:</p><ul class&…...
Java EE|TCP/IP协议栈之应用层协议DNS详解
文章目录一、对DNS的感性认识简介特点一些常见疑问二、DNSDNS域名结构域名的分级三、域名服务器四、域名解析过程参考一、对DNS的感性认识 简介 DNS,即Domain Name System,是域名系统的简称。它是Internet上解决网上机器命名的一种系统。 TCP/IP中的IP地址是由四…...
【MyBatis】作用域生命周期(四)
🚗MyBatis学习第四站~ 🚩起始站:MyBatis概述&环境搭建(一) 🚩本文已收录至专栏:数据库学习之旅 👍希望您能有所收获 一.引入 为了使用方便,我们经常能看到各种教程都将MyBatis抽离为工具类…...
腾讯一面—Android 系统启动流程详解
正文AMS 是 Android 中最核心的服务之一,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似,它本身也是一个 Binder 的实现类,应用进程能通过 Binder 机制调用…...
【Python知识点桂电版】02组合数据类型
一、序列序列简介序列是指一种包含多项数据的数据结构,分为不可变序列和可变序列。可变序列可修改序列内的元素如列表,二不可变序列一旦建立就不能修改其中的元素,字符串和元组属于不可变序列。列表和元组的创建列表:列表名 [元素…...
LeetCode100_100. 相同的树
LeetCode100_100. 相同的树 一、描述 给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 示例 1: 输入:p [1,2,3], q […...
javaEE 初阶 — 网络层中 IP 协议 的报文结构
文章目录IP 协议报文4位版本号4位首部长度8位服务类型16位总长度(字节数)8位生存时间(TTL)与 8位协议16位首部校验和32位源 IP 地址与32位目标 IP 地址动态分配的 IP 地址NAT 网络地址转换IPv6IP 协议报文 4位版本号 这里的 IP 协…...
iOS swift UICollectionView
文章目录1.纯代码自定义UICollectionViewCell2.禁止滑动(弹簧效果)3.UICollectionView的长按拖动2.在一个控制器中放两个UICollectionView或者UITableView,代理方法要怎么写1.纯代码自定义UICollectionViewCell import UIKitclass NewDeviceBottomColle…...
计算机三级数据库 填空题汇总
计算机三级 数据库 IDEF0需求建模方法由箭头和(活动/方框/矩形)两种元素构成。、从安全性角度考虑,防火墙技术是用来保证数据库应用系统的(网络)环境安全的。在UML的状态机图中,状态之间的转移是由&#x…...
【Java学习】初识Java
JavaSEJava初识1. Java简介2.Java环境的安装与配置3. 开发第一个Java程序Java初识 学前疑问:(带着疑问去学习,在学习中自行探索答案) Java是什么?能做什么?发展前景如何?需要学习哪些内容&…...
LabVIEW网络服务安全
LabVIEW网络服务安全如何保护Web服务?当许多人考虑安全性时,他们会考虑加密、用户ID和密码。用户ID和密码用于授权(告诉目标谁在发出请求)。加密保护客户端和服务器之间的通信流量,以便未经授权的个人无法拦截和读取发…...
基于MaixBit(K210芯片)的图像识别猜拳手势博弈装置
本文介绍了一种基于嵌入式平台开发的图像识别部署装置,其主要功能包括实现机器与人的“猜拳博弈”,其组成分为三个部分:手势检测数据集图像识别模型训练模型格式部署maixbit开发板部署手势检测数据集:本项目的数据集包括三种标签&…...
leetcode 41~50 学习经历
leetcode 41~50 学习经历41. 缺失的第一个正数42. 接雨水43. 字符串相乘44. 通配符匹配45. 跳跃游戏 II46. 全排列47. 全排列 II48. 旋转图像49. 字母异位词分组50. Pow(x, n)小结41. 缺失的第一个正数 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的…...
SQL注入原理及漏洞利用(入门级)
文章目录一、什么是SQL注入漏洞?二、 SQL查询语句三、SQL注入分类数字型(整型)注入字符型注入搜索型注入四、SQL注入漏洞形成原因一、什么是SQL注入漏洞? 攻击者利用Web应用程序对用户输入验证上的疏忽,在输入的数据中…...
2023/2/26 Vue学习笔记 配置代理解决跨域[CORS ]的问题
利用vue的脚手架巧妙的解决ajax跨域的问题 1 我们首先利用springboot服务搭建 注意这里引出了跨域[CORS ]的问题: Access to XMLHttpRequest at http://localhost:5000/getUserInfo from origin http://localhost:8080 has been blocked by CORS policy: No Access-Control-A…...
算法练习--深拷贝与浅拷贝
🎀个人主页:努力学习前端知识的小羊 感谢你们的支持:收藏🎄 点赞🍬 加关注🪐 文章目录算法地址算法题解分析深拷贝与浅拷贝在练习算法时,遇到了深拷贝与浅拷贝的问题,于是就了解了一…...
Wireshark “偷窥”浏览器与服务器三次握手
本文使用的是Wireshark 4.0.3, Java 11 编写简易服务器,客户端使用Chrome浏览器移动端开发或是前、后端开发又或是高大上的云计算都脱离不了网络,离开了网络的计算机就是一个孤岛,快速上手开发、背面试八股文固然有些急功近利,但确…...
基于stm32温湿度采集平台开发
基于stm32温湿度采集平台开发这里记录一下自己以前课设报告,但是论文中图片和文字、公式太多了,懒得粘贴了,需要完整的可q我963_160_156,也可在微信公众号 *高级嵌入式软件* 里回复 *温湿度* 查看完整版文章摘 要关键词第一章 绪论…...
单机模拟kafka分布式集群(演示生产、消费数据过程)
用单机搭建kafka伪分布式集群,其实集群的概念并不复杂 先说明一下,以下的每个服务启动后都需要新开一个终端来启动另外的服务(因为是集群,自然会用多个终端) 首先下载kafka 提取码:dvz4 或者直接去官网下载kafka_2.11-1.0.0.tgz t…...
办公室人员离岗识别检测系统 yolov7
办公室人员离岗识别检测系统根据yolov7网络模型深度学习技术,办公室人员离岗识别检测算法能够7*24小时全天候自动识别人员是否在岗位。YOLOv7 在 5 FPS 到 160 FPS 范围内,速度和精度都超过了所有已知的目标检测器,并在V100 上,30…...
Android从屏幕刷新到View的绘制(一)之 Window、WindowManager和WindowManagerService之间的关系
0. 相关分享 Android从屏幕刷新到View的绘制(一)之 Window、WindowManager和WindowManagerService之间的关系 Android从屏幕刷新到View的绘制(二)之Choreographer、Vsync与屏幕刷新 1. 相关类 WindowManagerService,…...
#多源数据融合#:HSI与Lidar
Lidar数据与HSI数据融合应该注意的问题 融合激光雷达(lidar)数据和高光谱数据可以提高地物特征的识别和分类准确性。以下是一些融合这两种数据的注意事项: 数据预处理 由于激光雷达数据和高光谱数据的特点不同,需要对两种数据进…...
android 权限控制与进程隔离
每次介绍说是做系统安全的,面试和领导首先就是说配selinux,实在很无语。虽然权限控制是安全很重要一环。 linux的进程就是系统运行中的程序(process),是正在执行的一个程序或者命令,每一个进程都是一个运行的实体,都有自己的地址空间,并占用一定的系统资源。Linux环境下…...
链表(一):移除链表元素、设计链表等力扣经典链表题目
203.移除链表元素相关题目链接:力扣 - 移除链表元素题目重现给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。思路链表的删除操作如上图所示,我们需要先找到要删除的…...
计算机网络 第4章 作业1
一、选择题 1. 由网络层负责差错控制与流量控制,使分组按序被递交的传输方式是_________(C) A.电路交换 B.报文交换 C.基于虚电路的分组交换 D.基于数据报的分组交换 2. TCP/IP 参考…...
Redis-Java代码使用示例
在我之前的项目中,使用Redis是我们团队自己封装了一个Redis操作类,但是这只是在Spring提供的RedisTemplate上做了一层封装而已,当时使用不是很熟练,都是一边在网上查资料,一边使用;这篇文章会介绍两种使用方…...
acwing3485最大异或和(trie树,贪心)
给定一个非负整数数列 a,初始长度为 N。 请在所有长度不超过 M 的连续子数组中,找出子数组异或和的最大值。 子数组的异或和即为子数组中所有元素按位异或得到的结果。 注意:子数组可以为空。 输入格式 第一行包含两个整数 N,M。 第二行…...
EasyRecovery16免费的电脑的数据恢复工具
常见的数据恢复有两种方式,第一种方式是找别人恢复,按照市场价来说,数据恢复的价格每次在100-500之间,但这种方式容易使自己设备上的隐私资料泄露出去,不安全。 另一种方式则是自己学会数据恢复的方法,有问…...
银行数字化转型导师坚鹏:平安银行数字化转型—橙E网战略研究
平安银行对公业务数字化转型案例—橙E网战略研究课程背景: 很多银行存在以下问题:不清楚银行对公业务数字化转型能否成功?不知道其它银行对公业务数字化转型的实际做法? 课程特色:用实战案例解读平安银行对公业务…...
定制网站制作报价/百度seo快速排名优化服务
1. JNA简单介绍先说JNI(Java Native Interface)吧,有过不同语言间通信经历的一般都知道,它允许Java代码和其他语言(尤其C/C)写的代码进行交互,只要遵守调用约定即可。首先看下JNI调用C/C的过程,注意写程序时自下而上,调…...
网站建设面临的困难/什么是搜索引擎优化?
上 看了一下以前的写的最新博客是在4月份。。 大二上就不说了,打了一学期游戏。大二下本来想自己写写东西,既然没有项目经验自己找事做,就打算写写网络硬盘,当时对前端十分敢兴趣,毕竟刚看完李炎恢的视频嘛ÿ…...
慈溪做网站哪家好/百度一下你就知道了官网
ios获取服务器数据 内容精选换一换该任务指导用户使用Loader将数据从SFTP服务器导入到HBase。创建或获取该任务中创建Loader作业的业务用户和密码。确保用户已授权访问作业执行时操作的HBase表或phoenix表。获取SFTP服务器使用的用户和密码,且该用户具备SFTP服务器上…...
客厅装修风格/乐陵seo优化
小试牛刀 WiFi 远控 wendu 废话 少说 直接上代码 DH11三根线 信号线 接2 WiFi 模块 r-------t t--------r en&vcc------3.3v剩下的 共地的啦 double Fahrenheit(double celsius) { return 1.8 * celsius 32; } //摄氏温度度转化为华氏温度 double Kelvin(doubl…...
p2p理财网站建设/广州网站外包
技术文章 更早之前 利用 javascript 实现富文本编辑器 JS正则表达式完整教程 从0.10.20.30000000000000004再看JS中的Number类型 前端跨域的整理 前端安全知识 从输入URL到页面加载的过程 虚拟DOM介绍 React常见问题 大公司里怎样开发和部署前端代码 饿了么的 PWA 升…...
广州网站推广排名/网址大全百度
一、将你要发布的moudle的build.gradle中添加代码,gradle的最后添加 PUBLISH_GROUP_ID com.zzti.fengyongge PUBLISH_ARTIFACT_ID imagepicker PUBLISH_VERSION 1.0 apply from: https://raw.githubusercontent.com/blundell/release-android-library/master/and…...