在程序运行过程中,结构体或类的字节对齐可以使程序更方便、更快速的执行,除了编译器本身的优化外,还可以在程序中手动对齐。在C/C++中,是通过引入#pragam pack(n)来实现的。

  缺省情况下,编译器为每个结构体或类中的每个成员按其自然对界(natural alignment,自然对界是指按结构体或类的成员中size最大的成员对齐)条件分配空间。各个成员安装它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构或类的地址相同。

  #pragma pack(n)的使用规则为:结构体或类中的数据成员,第一个放在偏移为0的地方,以后每个数据成员的对齐,按照n和自然对齐长度中比较小的那个进行。即,当n的值等于或超过所有数据成员的长度时,这个n值将不会产生任何效果。详见实例解释其用法:

(1)  #pragma pack(4)
    struct test {
      int a;      //第一个成员,放在[0,3]偏移的位置
      char b;   //第二个成员,自身长为1,和pack比较,取最小值,也就是1,所以这个按一个字节对齐,放在[4]偏移的位置
      short c;  //第三个成员,自身长为2,和pack比较,取最小值,也就是2,所以这个按两个字节最求,放在[6,7]偏移的位置
      char d;   //第四个成员,自身长为1,和pack比较,取最小值,也就是1,所以这个按一个字节对齐,放在[8]偏移的位置    
    };
  int nSize=sizeof(test);
      这个结构体实际占据内存9个字节,结构体或类之间的对齐,是按照类或结构体内部最大成员的长度和n值中较小的一个对齐的,这个例子中,结构体之间对齐的长度是min(n,sizeof(int)),也就是4,9按照4的整数倍为12,所以nSize=12.

(2) #pragma pack(4)
    struct test {
      char b;   //第一个成员,自身长为1,和pack比较,取最小值,也就是1,所以这个按一个字节对齐,放在[0]偏移的位置
      short c;  //第二个成员,自身长为2,和pack比较,取最小值,也就是2,所以这个按两个字节最求,放在[2,3]偏移的位置
      char d;   //第三个成员,自身长为1,和pack比较,取最小值,也就是1,所以这个按一个字节对齐,放在[4]偏移的位置    
    };
  int nSize=sizeof(test);
      这个结构体实际占据内存5个字节,结构体之间对齐的长度是min(n,sizeof(short)),也就是2,5按照2的整数倍为6,所以nSize=6.

转载于:https://www.cnblogs.com/zhaolizhe/p/6945620.html

结构体内字节手动对齐(#pragam pack)相关推荐

  1. c语言结构体的对齐方式,C语言结构体内存的对齐知识详解

    前言 在前面的章节中,我们谈到了C语言中整数以及浮点数的储存 今天,我们来谈一谈一些关于结构体内存的知识. 我们先来看一个例子: struct S1 { char c1; int i; char c2 ...

  2. c/c++下取消结构体字节对齐方法

    c/c++下取消结构体字节对齐方法 在c/c++下编译器会默认地对结构体进行对齐,其对齐的方法跟平台具体的特性有关,本文主要介绍结构体不进行对齐的方法. 1.结构体字节不进行对齐的用途 (1).减小内 ...

  3. struct结构体内存对齐解析

    为什么要内存对齐 虽然所有的变量最后都会保存到特定的地址内存中去,但是相应的内存空间必须满足内存对齐的要求,主要基于存在以下两个原因: 硬件平台原因: 并不是所有的平台都能够访问任意地址上的任意数据, ...

  4. 嵌入式开发过程中结构体字节对齐问题pragma pack(1)

    一.引言 曾经刚入门嵌入式在开发一个应用时,用到了自定义结构体,底层嵌入式单片机运行该结构体没问题,但是在Qt开发应用软件对接协议时,一直通不过,仔细分析才发现是QT这边的结构体字节并没有按照单字节对 ...

  5. 【APUE】Chapter17 Advanced IPC sign extension 结构体内存对齐

    17.1 Introduction 这一章主要讲了UNIX Domain Sockets这样的进程间通讯方式,并列举了具体的几个例子. 17.2 UNIX Domain Sockets 这是一种特殊s ...

  6. 语言结构体在内存的分布_结构体内存对齐,这篇文章给你彻底搞会!(干货收藏)...

    脚本之家 你与百万开发者在一起 公众号:C语言编程 作者:薛定谔的coding猫 一.内存对齐的原因  1.平台原因(移植原因):一些资料上是这样说的,"不是所有的硬件平台都能访问任意地址上 ...

  7. c#往结构体里面读数据_结构体内存对齐,这回给你彻底搞会!

    一.内存对齐的原因  1.平台原因(移植原因):一些资料上是这样说的,"不是所有的硬件平台都能访问任意地址上的任意数据:某些硬件平台只能在某些特定地址处取某些特定的数据,否则就会抛出硬件异常 ...

  8. c语言 char转int_图文并茂,一文讲透C语言结构体内存对齐

    ↑点击上方蓝色字体,关注"嵌入式软件实战派"获得更多精品干货. (以下有约5000字内容,建议收藏再读,推荐下载源码自行测试以加深理解.) 面试官:你知道C语言的结构体对齐吗? 应 ...

  9. 一文了解结构体字节对齐

    结构体字节对齐详解 表述如有不正确的地方,欢迎批评指正. C++/C 常见的基本数据类型: bool short (short int) int long (long int) long long ( ...

最新文章

  1. Office 365用户现可分享含有效期的OneDrive文件链接
  2. httpwebrequest超时时间timeout设置无效_【SpringBoot WEB 系列】RestTemplate 之超时设置...
  3. C++11空指针(nullptr)
  4. 动态规划应用--最长递增子序列 LeetCode 300
  5. 阿里云李飞飞:今年将帮1000家企业“去O”,完成10000套传统数据仓库上云
  6. 信息学奥赛一本通 2070:【例2.13】数字对调
  7. 人人都能看懂的 LSTM
  8. XHTML CSS 常见问题和解决方案
  9. 列表的pop()和路径拼接问题
  10. PHP 5 将于年底停止更新,六成用户将面临安全风险
  11. Project Euler Problem 48: Self powers
  12. jquery跨域访问解决方案
  13. layui横向时间线_除了性能“铁三角”还有什么?iQOO 3全新横向线性马达上手体验...
  14. 使用VS2017和Qt编译OpenCV
  15. 2021年软件测试工具总结——测试管理工具
  16. KYC (Know Your Customer) 综述篇
  17. 阿里程序员,工作6年,真实薪资曝光
  18. 读懂Windows的“虚拟内存”为你量身定制
  19. 新手怎样安装win10系统?win10系统安装教程解读
  20. [线段树or笛卡尔树+简单KMP]poj4005 or hdu4125 Moles

热门文章

  1. HDFS文件上传、下载和删除案例
  2. 使用Axis2创建一个简单的WebService服务
  3. python学习手册笔记——20.迭代和解析
  4. openresty nginx升级版
  5. 初入android驱动开发之字符设备(一)
  6. # 利用fragment实现界面跳转
  7. Onpaint和OnDraw的区别
  8. ASP.NET MVC 音乐商店 - 9. 注册和结账
  9. 根据数据库中不同的值显示不同的图片
  10. R语言入门第五集 实验四:数据分析