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

C++标准 alignas 与 windows 封装指令 (pack pragma) 的区别

C++标准 alignas 与 windows 封装指令 (pack pragma) 的区别

结构体内存对齐受到二方面的影响【共同作用】:

一个方面是语言的对齐规则=》语言的对齐规则
参考 https://blog.csdn.net/weixin_43698578/article/details/104801421 【主要影响因素是成员的对齐大小】【基本类型的对齐大小就是其sizeof大小;复合类型的对齐大小是其每个成员对齐大小的最大值(若成员还是复合类型,则递归应用此规则)】
而C++标准关键字alignas 的语义就是直接指定 复合类型的对齐大小的【仅此而已=>即不会影响复合类型它自己的成员的对齐大小,也不管实际的封包对齐过程(这由封装控制)】=>所以alignas这样干巴巴的直接指定是有限制的那就是不能指定比此复合类型按原生(正常方式)判定的对齐大小更小的值!

另一个方面是封包的影响:
平台编译器在内部会维护一个封包(封装)堆栈;此封包(装)堆栈栈顶的记录项对应的值;就是当前使用的封装对齐值【这是一个新概念】;这个封装对齐值会影响到结构体对齐的过程:具体行为是=>将每个成员的对齐大小与此封装对齐值比较,并选用较小的【注:这里是取用较小的了】;作为对齐过程中影响内存布局的实际对齐值(就暂时称为对齐分布值吧);每个成员在结构体中内存偏移位置必须是其对齐分布值的整数倍;整个结构体对象在内存中的位置,也必须是这个结构体对象的对齐分布值的整数倍!

(每个实体(无论是成员还是对象)的对齐分布值=>
是由 封装对齐值 和 此实体的对齐大小 共同决定【即这二个值比较并选用最小的】

封装对齐值:(编译期由编译器根据编译程序内部维护的封装堆栈栈顶记录项的值为每个类型指定)
【是编译源代码时,在编译过程(对于编译程序是运行期动态的)中编译器内部维护的封装堆栈的栈顶记录项对应的值确定;在编译源码过程中,编译器编译到类型(无论是处理基础类型,还是复合类型)时会将编译期内部维护的封装堆栈的栈顶记录项对应的值指定为此类型的封装对齐值】
而pack pragma 编译指令就是在编译期编译器运行时处理每个类型时,对编译器程序动态维护的封装堆栈进行操作=>修改栈顶记录项,让此时类型的封装对齐值被指定为不同的栈顶记录项的值;当然也可以不用pack 指令,那么编译器编译每个模块时,封装堆栈的栈顶记录项有一个默认的值;编译每个类型时取栈顶记录值标记每个类型的封装对齐值的过程是不变的

实体的对齐大小:(根据语言标准确定的,虽然也是编译器编译期确定的)
【粒度是针对每个实体有自己的对齐大小】
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述


http://www.kler.cn/news/283896.html

相关文章:

  • 物联网架构之HBase
  • AI加持的开发平台,如何满足您的独一无二?
  • 智能合约开发与测试1
  • [LLM][Prompt Engineering]:大语言模型提示工程(Prompt Engineering)
  • Navicat Lite导入为SQL,然后到服务器的SQLServer Management 里执行时,报各种错误,是文件的Encoding不一致导致的解决
  • 科讯档案管理系统存在SQL注入漏洞(0day)
  • 聚类算法k-means(手撕和调用skl)
  • Python编码系列—Python项目架构的艺术:最佳实践与实战应用
  • 【数据结构】关于哈希表内部原理,你到底了解多少???(超详解)
  • 自动化01:认识接线端子
  • vue脚手架的创建
  • 基于多条件复杂查询的JSON指令搜索与排序算法设计
  • -[meetingbot4ios.AppDelegate window]: unrecognized selector sent to instance
  • 黑屏环境下,如何利用OBD部署OceanBase企业版集群
  • Web3开发与安全:6个月高效学习路径
  • Python从入门到进阶教程文章分享汇总~持续更新
  • 缓存:浅谈双写导致的数据一致性问题
  • 【2024 CCF编程能力等级认证(GESP)Python 】一级大纲
  • 桥接与NET
  • AI-Talk开发板硬件适配
  • 改造小蚁摄像头支持免费无限容量云储存(Samba挂载篇)
  • 零基础入门转录组数据分析——基因Wilcoxon秩和检验
  • python进阶篇-day02-面向对象高级
  • DIFFUSION 系列笔记| Latent Diffusion Model、Stable Diffusion基础概念、数学原理、代码分析、案例展示
  • 【node.js】基础之修改文件
  • APP渠道来源方案探索
  • 第22周:调用Gensim库训练Word2Vec模型
  • 使用对象池优化 C++ 程序性能的实用指南
  • 传输层协议-UDP数据报
  • 6 自研rgbd相机基于rk3566之深度计算库程序详解