#pragma pack 内存对齐
1. 用法
#pragma pack是C/C++里面设置字节对齐方式的预编译函数
2. 解释
先看下面代码:
#include <iostream>
using namespace std;class test {char m1;float m2;char m3;
};
int main()
{test t;cout << sizeof(t);
}
这个类的大小是多少呢?
1+4+1=6?
运行结果如下
3. 自然对齐
为什么会是12呢?其实类在分配空间的时候,会按一定方式进行对齐。
首先看第一个成员m1,它的大小为1字节,这时自然对界就是1,它就会被放在起始位置,如下图
当m2过来时,由于它的大小为4字节,这时自然对界变为4,m2必须放在其对界上面,对界的位置就是“当前数据大小 * n",所以m2的边界必须是4的倍数,这时为了满足要求会补三个字节
当m3过来时,它是1字节,所以正好落在对界,如下图
但是这时并没有结束,我们来回顾刚刚的所有成员数据,其中最大的是m2,4字节,所以整个类的自然对界大小为4,整个类的大小也必须是成员变量字节最大数的n倍,所以继续补三个字节,一共12字节,如下图
那么对于下面这个类,我们也可以计算一下
class test {int m1;double m2;char mm;
};
m1时大小为4,m2来时必须落在对界,补4字节,加上m2自身大小,这时总长度为16,m3来时,大小加1,总长度为17,但是最大对界为8,所以总长必须是8的倍数,补7字节,总长为24.
4. 类的对界大小
class Test1{int m1;int m2;double m3;
}class Test2{int m1;int m2;double m3;Test1 m4;
}
那么Test2中Test1的对界取多少呢,对于类来说,它的默认对界就是它的所有成员使用的对界中最大的一个
5. #pragma pack的意义
#pragma pack就是为了设置对齐大小而存在的,它的用法为
#pragma pack(push)//保存上一对齐大小#pragma pack(length)//设置对齐大小,length是一个正整数一般为2^nclass....{
}#pragma pack(pop) //恢复原本对齐大小
这样就手动设置了对齐大小为length,也可以简写如下:
#pragma pack(push, length)//设置对齐大小,length是一个正整数一般为2^nclass....{
}#pragma pack(pop) //恢复原本对齐大小
6. 示例
#pragma pack(push,2)
class test {char m1;float m2;char m3;
};
此时对界为2.
m1来的时候,m1长度为1,对界为2,实际对界取二者最小,取1,总长度为1
m2来时,m2长度为4,对界为2,取最小,取2,这时m2要落在对界上,必须补一个空位,现在总长度为4,如下图
m3来时,m3长度为1,对界为2,取最小,取1,这时m3刚好落在对界上,此时总长度为5。
这时,会将总长度补齐为之前最长对界的n倍,也就是4的n倍,取8,所以总长度为8
#pragma pack 内存对齐相关推荐
- pack 内存对齐操作
#pragma pack(push) //保存对齐状态 #pragma pack(4)//设定为4字节对齐 #pragma pack(pop)//恢复对齐状态 #pragma pack( [show] ...
- 计算机大端模式和小端模式 内存对齐问题(sizeof)
目录(?)[+] 一大端模式和小端模式的起源 二什么是大端和小端 三数组在大端小端情况下的存储 四为什么会有大小端模式之分呢 五如何判断机器的字节序 内存对齐问题 再讲讲pragma pack 内存对 ...
- 结构体对齐,#pragma pack
一.结构体对齐 首先通过一个例子说明结构体对齐,可以看到,下面这个结构体占32字节(32位) typedef struct {double d;short s;int i;char c;short s ...
- C语言:指针的偏移步长、结构体成员的偏移量、嵌套结构体成员的偏移量、结构体的内存对齐
文章目录 1 不同类型指针的偏移步长 2 结构体成员的偏移量 3 嵌套结构体成员的偏移量 4 结构体的内存对齐 4.1 内存对齐的原因与优点 4.2 结构体内存对齐的规则 4.3 结构体嵌套结构体时的 ...
- C语言 结构体,内存对齐,对齐参数,偏移量
文章目录 sizeof() 内存对齐 内存对齐的背景 全部规则汇总(看这里) 典型例子: Pragma Pack(n)与内存分配 #pragma pack对对齐模数的影响 偏移量 sizeof() 对 ...
- 字节对齐看这篇就够了(内存对齐)
前言 大家好,我是小昭,因为在不同硬件平台数据传输时,遇到关于字节对齐的问题,索性就做了总结,以下是我对字节对齐的理解和小结,如有疑问请联系我. 目录 结构体变量占用空间不同 为什么要字节对齐?(内存 ...
- Linux C/C++编程——常用关键字pragma pack和attribute_packed总结
(一)pragma pack使用说明 用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题,有时候为了内存对齐需要补齐空字节.通常写 ...
- 详解C/C++中的的:#pragma pack(push) 、#pragma pack(pop) 和#pragma pack()
前言 我们知道结构体内存对齐字节可以通过#pragma pack(n) 的方式来指定. 但是,有没有想过一个问题,某些时候我想4字节对齐,有些时候我又想1字节或者8字节对齐,那么怎么解决这个问题呢? ...
- 快速理解内存对齐以及#pragma pack
一.内存对齐目的与原理 1.内存对齐的目的 假如没有内存对齐机制,数据可以任意存放,现在一个int变量存放在从地址1开始的联系四个字节地址中,该处理器去取数据时,要先从0地址开始读取第一个4字节块,剔 ...
最新文章
- Redis Server Memory Optimization
- linux grunt环境,安装 Grunt - Grunt: JavaScript 世界的构建工具 | Grunt 中文网
- Linux系统的进程管理
- 2.1.1 正则化基本介绍
- queue的常见用法详解
- 机器学习-分类算法-逻辑回归13
- Python学习笔记:函数(Function)
- c语言while break用法举例,C语言 关于while,for,break
- CSS 改变文本选中颜色
- 台达b2伺服modbus通讯_台达伺服ASDA-B2使用手册-简体最新.pdf
- 接口设计需要考虑哪些方面
- 用非门74HC04与无源晶振产生时钟信号的两种电路
- Java API连接Kerberos认证的HBASE
- Uva 10158 War
- photoshop读书笔记
- JAVA教程--书的
- 【无标题】deployment does not have minimum availability
- Kerberos (一) --------- Kerberos 部署
- (19)一篇掌握MySQL数据库基础下 基本操作(外键约束、建表原则、多表查询、子查询)
- Python 修改文件名加前缀
热门文章
- ping命令工具:同时ping多个IP
- Web的现状:网页性能提升指南
- 《Ansible权威指南 》一 第一篇 Part 1 基础入门篇
- elastaticsearch 5.1.2 x-pack 设置权限访问
- Java三大主流框架概述
- 【Win10 应用开发】语音命令与App Service集成
- 整数展示分数和整形数的四则运算
- 想挖矿?不如先学习一下以太坊
- 编写文档_如何通过编写优质文档来使自己的未来快乐
- ios 应用和电脑共享文件夹_堪比AirDrop,苹果 iPhone与Windows电脑互传文件的三种方式...