结构体内字节手动对齐(#pragam pack)
在程序运行过程中,结构体或类的字节对齐可以使程序更方便、更快速的执行,除了编译器本身的优化外,还可以在程序中手动对齐。在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)相关推荐
- c语言结构体的对齐方式,C语言结构体内存的对齐知识详解
前言 在前面的章节中,我们谈到了C语言中整数以及浮点数的储存 今天,我们来谈一谈一些关于结构体内存的知识. 我们先来看一个例子: struct S1 { char c1; int i; char c2 ...
- c/c++下取消结构体字节对齐方法
c/c++下取消结构体字节对齐方法 在c/c++下编译器会默认地对结构体进行对齐,其对齐的方法跟平台具体的特性有关,本文主要介绍结构体不进行对齐的方法. 1.结构体字节不进行对齐的用途 (1).减小内 ...
- struct结构体内存对齐解析
为什么要内存对齐 虽然所有的变量最后都会保存到特定的地址内存中去,但是相应的内存空间必须满足内存对齐的要求,主要基于存在以下两个原因: 硬件平台原因: 并不是所有的平台都能够访问任意地址上的任意数据, ...
- 嵌入式开发过程中结构体字节对齐问题pragma pack(1)
一.引言 曾经刚入门嵌入式在开发一个应用时,用到了自定义结构体,底层嵌入式单片机运行该结构体没问题,但是在Qt开发应用软件对接协议时,一直通不过,仔细分析才发现是QT这边的结构体字节并没有按照单字节对 ...
- 【APUE】Chapter17 Advanced IPC sign extension 结构体内存对齐
17.1 Introduction 这一章主要讲了UNIX Domain Sockets这样的进程间通讯方式,并列举了具体的几个例子. 17.2 UNIX Domain Sockets 这是一种特殊s ...
- 语言结构体在内存的分布_结构体内存对齐,这篇文章给你彻底搞会!(干货收藏)...
脚本之家 你与百万开发者在一起 公众号:C语言编程 作者:薛定谔的coding猫 一.内存对齐的原因 1.平台原因(移植原因):一些资料上是这样说的,"不是所有的硬件平台都能访问任意地址上 ...
- c#往结构体里面读数据_结构体内存对齐,这回给你彻底搞会!
一.内存对齐的原因 1.平台原因(移植原因):一些资料上是这样说的,"不是所有的硬件平台都能访问任意地址上的任意数据:某些硬件平台只能在某些特定地址处取某些特定的数据,否则就会抛出硬件异常 ...
- c语言 char转int_图文并茂,一文讲透C语言结构体内存对齐
↑点击上方蓝色字体,关注"嵌入式软件实战派"获得更多精品干货. (以下有约5000字内容,建议收藏再读,推荐下载源码自行测试以加深理解.) 面试官:你知道C语言的结构体对齐吗? 应 ...
- 一文了解结构体字节对齐
结构体字节对齐详解 表述如有不正确的地方,欢迎批评指正. C++/C 常见的基本数据类型: bool short (short int) int long (long int) long long ( ...
最新文章
- Office 365用户现可分享含有效期的OneDrive文件链接
- httpwebrequest超时时间timeout设置无效_【SpringBoot WEB 系列】RestTemplate 之超时设置...
- C++11空指针(nullptr)
- 动态规划应用--最长递增子序列 LeetCode 300
- 阿里云李飞飞:今年将帮1000家企业“去O”,完成10000套传统数据仓库上云
- 信息学奥赛一本通 2070:【例2.13】数字对调
- 人人都能看懂的 LSTM
- XHTML CSS 常见问题和解决方案
- 列表的pop()和路径拼接问题
- PHP 5 将于年底停止更新,六成用户将面临安全风险
- Project Euler Problem 48: Self powers
- jquery跨域访问解决方案
- layui横向时间线_除了性能“铁三角”还有什么?iQOO 3全新横向线性马达上手体验...
- 使用VS2017和Qt编译OpenCV
- 2021年软件测试工具总结——测试管理工具
- KYC (Know Your Customer) 综述篇
- 阿里程序员,工作6年,真实薪资曝光
- 读懂Windows的“虚拟内存”为你量身定制
- 新手怎样安装win10系统?win10系统安装教程解读
- [线段树or笛卡尔树+简单KMP]poj4005 or hdu4125 Moles