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…...
PasteMD助力程序员提效:代码片段/日志/报错信息一键转高亮Markdown
PasteMD助力程序员提效:代码片段/日志/报错信息一键转高亮Markdown 1. 引言:从杂乱文本到优雅文档的烦恼 你有没有过这样的经历?在技术讨论群里,同事发来一段报错日志,密密麻麻的堆栈信息挤在一起,看得人…...
解决语音合成难题:用QWEN-AUDIO实现高质量、带情绪的TTS
解决语音合成难题:用QWEN-AUDIO实现高质量、带情绪的TTS 1. 语音合成的痛点与突破 传统语音合成技术(TTS)长期面临三大难题:机械感强、缺乏情感表现力、定制成本高。许多开发者尝试过开源解决方案,但往往需要复杂的参数调整才能获得勉强可用…...
SGLang-v0.5.6优化技巧:合理配置GPU内存利用率
SGLang-v0.5.6优化技巧:合理配置GPU内存利用率 1. 引言 在大模型推理的实际部署中,GPU内存管理往往是决定服务稳定性和性能的关键因素。SGLang-v0.5.6作为专为高效推理设计的框架,提供了精细化的GPU内存控制机制。本文将深入解析如何通过合…...
YOLO-v5小目标检测:微小物体识别效果惊艳展示
YOLO-v5小目标检测:微小物体识别效果惊艳展示 1. 小目标检测的技术挑战 在计算机视觉领域,小目标检测一直是个棘手的问题。当目标在图像中占据的像素面积小于3232时,传统检测算法往往会遇到以下困难: 特征信息不足:…...
文脉定序GPU利用率优化:BGE-Reranker-v2-m3批处理与动态序列长度调优
文脉定序GPU利用率优化:BGE-Reranker-v2-m3批处理与动态序列长度调优 1. 优化背景与价值 在实际部署文脉定序系统时,我们发现GPU利用率存在明显瓶颈。当处理大量检索结果的重排序任务时,传统的逐条处理方式导致GPU计算资源大量闲置…...
互联网产品创新:基于Qwen3-ASR-0.6B的在线教育实时字幕解决方案
互联网产品创新:基于Qwen3-ASR-0.6B的在线教育实时字幕解决方案 1. 引言 想象一下,你正在上一节重要的在线直播课,老师讲得飞快,有些专业术语没听清,或者因为网络波动声音断断续续。又或者,你身处一个嘈杂…...
InfiniTime智能手表固件完全指南:从零开始打造你的开源智能手表
InfiniTime智能手表固件完全指南:从零开始打造你的开源智能手表 【免费下载链接】InfiniTime Firmware for Pinetime smartwatch written in C and based on FreeRTOS 项目地址: https://gitcode.com/gh_mirrors/in/InfiniTime InfiniTime是一款为Pinetime智…...
Windows屏保设置失效?解锁注册表权限的终极指南
1. 为什么你的Windows屏保设置突然失效了? 最近有没有遇到过这种情况:明明想设置个屏保保护隐私,却发现所有选项都变成灰色不可点击?这个问题我帮不少朋友解决过,其实90%的情况都是注册表权限在作怪。Windows系统有个特…...
老旧Mac升级指南:OpenCore Legacy Patcher实现Monterey系统适配
老旧Mac升级指南:OpenCore Legacy Patcher实现Monterey系统适配 【免费下载链接】OpenCore-Legacy-Patcher 体验与之前一样的macOS 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 随着macOS系统不断迭代,许多经典Ma…...
EF Core与SQLite实战:从零构建轻量级数据库应用
1. 为什么选择EF Core与SQLite这对黄金组合 如果你正在开发一个需要本地数据存储的移动应用或桌面小工具,SQLite绝对是你的首选数据库。这个只有几百KB的小家伙,不需要任何服务器配置,直接读写单个文件就能完成所有数据库操作。而EF Core作为…...
