[C++]宏定义字节对齐#PragmaPack/Pop

2023-10-27

#Pragma Pack (n)    //指定对齐的字节数
...
#pragma pop  (pop)  //恢复对齐状态,默认4字节对齐

目录

什么是对齐

对齐规则

功能

应用


什么是对齐

现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。

对齐规则

结构体中各个成员按照它们被声明的顺序在内存中顺序存储。

  1. 将结构体内所有数据成员的长度值相加,记为sum_a; 
  2. 将各数据成员内存对齐,按各自对齐模数而填充的字节数累加到和sum_a上,记为sum_b。对齐模数是【该数据成员所占内存】与【#pragma pack指定的数值】中的较小者。
  3. 将和sum_b向结构体模数对齐,该模数是【#pragma pack指定的数值】、【未指定#pragma pack时,系统默认的对齐模数8字节】和【结构体内部最大的基本数据类型成员】长度中数值较小者。结构体的长度应该是该模数的整数倍。
  4. 静态变量的存放位置与结构体实例的存储地址无关,是单独存放在静态数据区的,因此用siezof计算其大小时没有将静态成员所占的空间计算进来。这一点对类和结构体都适用。
  5. 普通函数:不占用内存;虚函数:要占用4个字节,用来指定虚函数的虚拟函数表的入口地址。子类与父类共享虚函数入口地址。

设想

不同平台在内存处理和读取顺序上不一致,不对这种情况作出预防措施,可能会失存取效率。这也是时间空间复杂度方面的习惯把握。

假设存在平台读取数据起点为奇/偶地址,可能会多余一个时间周期,并且增加高低地址拼接操作。

应用

在结构体前加上#Pragma Pack(1),以一个字节对齐,使用完后要加#pragma pack(),释放内存对齐。

打比方,现在是windows10 x64的机器,理论上结构体占据空间30字节,打印结果为40。

而当声明了1字节对齐后

所有示例可在git仓库内下载,learnProject/csdnExample at main · 1900Linz/learnProject · GitHub

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[C++]宏定义字节对齐#PragmaPack/Pop 的相关文章

  • 删除文件的最后 10 个字符

    我想删除文件的最后 10 个字符 说一个字符串 hello i am a c learner 是文件内的数据 我只是希望该文件是 hello i am a 文件的最后 10 个字符 即字符串 c learner 应在文件内消除 解决方案 将
  • 结构化绑定中缺少类型信息

    我刚刚了解了 C 中的结构化绑定 但有一件事我不喜欢 auto x y some func is that auto正在隐藏类型x and y 我得抬头看看some func的声明来了解类型x and y 或者 我可以写 T1 x T2 y
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 结构体的内存大小不同?

    为什么第一种情况不是12 测试环境 最新版本的 gcc 和 clang 64 位 Linux struct desc int parts int nr sizeof desc Output 16 struct desc int parts
  • 如何定义一个可结构化绑定的对象的概念?

    我想定义一个concept可以检测类型是否T can be 结构化绑定 or not template
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri

随机推荐

  • 2022第十三届蓝桥杯国赛真题javaB组 (我自己做的)

    A 重合次数 2023 5 1 问题描述 在同一天中 从上午 6 点 13 分 22 秒到下午 14 点 36 分 20 秒 钟表上的 分针和秒针一共重合了多少次 注意时针 分针 秒针都围绕中心敳匀速运动 答案提交 这是一道结果填空的题 你
  • Android_App多语言切换

    前段时间公司 App 需要实现多语言切换功能 接到任务后先 Google 了下 发现搜到的方法都比较老旧 很多都莫名其妙 比如什么 API 欺骗 反射 手动转换语系 感觉不应该这么复杂地实现 也可能是当时的环境下实现确实比较麻烦 所以花了点
  • flink学习day04:对Event Time 与 Watermark的理解

    带大家零基础入门flink flink学习day01 Flink基础入门 含案例 flink学习day02 datasource transforma和sink flink学习day03 flink datastream 开发 流式计算中时
  • 【操作系统】常见面试题集锦(全)

    目录 前言 1 进程 线程的区别和联系 2 有了进程为什么还要线程 3 进程状态的切换 4 并发和并行 5 外中断和异常的区别 6 进程调度算法了解多少 7 动态分区分配算法的了解 8 Linux下进程间通信方式 9 几种典型的锁 10 地
  • Python3中pass语句介绍

    python3中的pass语句是一个空语句 什么都不做 执行它时什么也没有发生 是一个空操作 pass语句通常用作占位符 place holder 即当用户不知道要编写什么代码时 用户只需在那行上放置pass 在语法上需要有条语句但是确不希
  • HTML5-4-表单

    文章目录 表单属性 表单标签 输入元素 文本域 Text Fields 密码字段 单选按钮 Radio Buttons 复选框 Checkboxes 按钮 button 提交按钮 Submit label标签 文本框 textarea 下拉
  • 求解1+2+3+...+n,要求不能使用乘除法、while、for、if 、else、switch、case等关键字

    方法一 利用递归以及 的短路原理 int Sum int num int sum num Sum num 1 sum 递归跳出条件 当num为假时 无需判断后序语句 返回sum n return sum num int main int n
  • c#----类和对象

    1 1 类和对象 类 class 是最基础的c 类型 类是一个数据结构 将状态 字段 和操作 方法和其它函数成员 组合在一个单元中 类为动态创建的类实例 instance 提供了定义 实例也称对象 object 类支持继承 inherita
  • mybatis的关联查询(一对一和一对多的实现)

    1 一对一的关联查询 1 1 准备查询的sql语句 用户与订单 关联查询 select o id o name o address u name u address from orders o left join user u on o u
  • Prometheus的函数和计算公式

    Prometheus强大的地方就在于可以它可以使用的很多计算公式去获取自己需要的数据 这里所涉及到的计算公式 也是我们普遍认为的难点所在 在Zabbix中想要获取CPU使用率是一件非常简单的事情 但是在Prometheus中却需要通过计算公
  • 如何理解算法时间复杂度的表示法O(n²)、O(n)、O(1)、O(nlogn)等?

    时间复杂度这个东西 其实更准确点说应该是描述一个算法在问题规模不断增大时对应的时间增长曲线 所以 这些增长数量级并不是一个准确的性能评价 可以理解为一个近似值 时间的增长近似于logN NlogN的曲线 先从O 1 来说 理论上哈希表就是O
  • ElementPlus主题色修改

    一般情况下我们使用elementplus的时候 肯定需要更改他的主题颜色 我们系统中的主题颜色大多数的时候适合他的主题颜色不一样的 那么如何更改呢 我是在assets styles element index scss下 forward e
  • linux系统关于 unrecognized service

    能ping 通服务器 但远程无法连接 我怀疑远程服务没开启 就输入了 service sshd start命令 结果显示 ssh unrecognized service 我输入查看命令 service ssh status 显示也是 un
  • springboot和vue项目如何上传图片,结合若依框架实现

    一 后台代码 RequestMapping value upload method RequestMethod POST headers content type multipart form data ApiOperation value
  • 【开发工具】iOS真机调试抓包工具Charles安装及使用

    支持原创 更多内容请关注 http www china10s com blog p 271 iOS开发过程中 经常需要用真机来测试和后台的网络数据传输 需要一个趁手的抓包工具 在Windows下用的fidder很好用 但是由于它是在 Net
  • 软连接的建立和删除

    想把A文件夹放在B文件夹下面 ln s A B 想取消软连接 rm rf B A 千万不要写成 rm rf B A 这样会删除A里面的数据
  • [2020.5.30]gdb常用总结

    前提 使用的是带debug信息的动态库 1 info 1 types 查看该类型符号是否存在 若存在显示该类型符号相关信息 info types SDL WindowData info types ucontext t 2 function
  • CSS中关于字体样式p标签的属性

    CSS中关于P标签中的样式 1 font family 浏览器在显示字体的时候 依次判断是否支持当前的字体 直到最后的字体系列 font family 宋体 仿宋 sans serif 浏览器若不支持宋体 则用仿宋 若不支持仿宋 则在san
  • Kafka3.0.0版本——消费者(消费者组详细消费流程图解及消费者重要参数)

    目录 一 消费者组详细消费流程图解 二 消费者的重要参数 一 消费者组详细消费流程图解 创建一个消费者网络连接客户端 主要用于与kafka集群进行交互 如下图所示 调用sendFetches发送消费请求 如下图所示 1 Fetch min
  • [C++]宏定义字节对齐#PragmaPack/Pop

    Pragma Pack n 指定对齐的字节数 pragma pop pop 恢复对齐状态 默认4字节对齐 目录 什么是对齐 对齐规则 功能 应用 什么是对齐 现代计算机中内存空间都是按照byte划分的 从理论上讲似乎对任何类型的变量的访问可