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 内存对齐相关推荐

  1. pack 内存对齐操作

    #pragma pack(push) //保存对齐状态 #pragma pack(4)//设定为4字节对齐 #pragma pack(pop)//恢复对齐状态 #pragma pack( [show] ...

  2. 计算机大端模式和小端模式 内存对齐问题(sizeof)

    目录(?)[+] 一大端模式和小端模式的起源 二什么是大端和小端 三数组在大端小端情况下的存储 四为什么会有大小端模式之分呢 五如何判断机器的字节序 内存对齐问题 再讲讲pragma pack 内存对 ...

  3. 结构体对齐,#pragma pack

    一.结构体对齐 首先通过一个例子说明结构体对齐,可以看到,下面这个结构体占32字节(32位) typedef struct {double d;short s;int i;char c;short s ...

  4. C语言:指针的偏移步长、结构体成员的偏移量、嵌套结构体成员的偏移量、结构体的内存对齐

    文章目录 1 不同类型指针的偏移步长 2 结构体成员的偏移量 3 嵌套结构体成员的偏移量 4 结构体的内存对齐 4.1 内存对齐的原因与优点 4.2 结构体内存对齐的规则 4.3 结构体嵌套结构体时的 ...

  5. C语言 结构体,内存对齐,对齐参数,偏移量

    文章目录 sizeof() 内存对齐 内存对齐的背景 全部规则汇总(看这里) 典型例子: Pragma Pack(n)与内存分配 #pragma pack对对齐模数的影响 偏移量 sizeof() 对 ...

  6. 字节对齐看这篇就够了(内存对齐)

    前言 大家好,我是小昭,因为在不同硬件平台数据传输时,遇到关于字节对齐的问题,索性就做了总结,以下是我对字节对齐的理解和小结,如有疑问请联系我. 目录 结构体变量占用空间不同 为什么要字节对齐?(内存 ...

  7. Linux C/C++编程——常用关键字pragma pack和attribute_packed总结

    (一)pragma pack使用说明 用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题,有时候为了内存对齐需要补齐空字节.通常写 ...

  8. 详解C/C++中的的:#pragma pack(push) 、#pragma pack(pop) 和#pragma pack()

    前言 我们知道结构体内存对齐字节可以通过#pragma pack(n) 的方式来指定. 但是,有没有想过一个问题,某些时候我想4字节对齐,有些时候我又想1字节或者8字节对齐,那么怎么解决这个问题呢? ...

  9. 快速理解内存对齐以及#pragma pack

    一.内存对齐目的与原理 1.内存对齐的目的 假如没有内存对齐机制,数据可以任意存放,现在一个int变量存放在从地址1开始的联系四个字节地址中,该处理器去取数据时,要先从0地址开始读取第一个4字节块,剔 ...

最新文章

  1. Redis Server Memory Optimization
  2. linux grunt环境,安装 Grunt - Grunt: JavaScript 世界的构建工具 | Grunt 中文网
  3. Linux系统的进程管理
  4. 2.1.1 正则化基本介绍
  5. queue的常见用法详解
  6. 机器学习-分类算法-逻辑回归13
  7. Python学习笔记:函数(Function)
  8. c语言while break用法举例,C语言 关于while,for,break
  9. CSS 改变文本选中颜色
  10. 台达b2伺服modbus通讯_台达伺服ASDA-B2使用手册-简体最新.pdf
  11. 接口设计需要考虑哪些方面
  12. 用非门74HC04与无源晶振产生时钟信号的两种电路
  13. Java API连接Kerberos认证的HBASE
  14. Uva 10158 War
  15. photoshop读书笔记
  16. JAVA教程--书的
  17. 【无标题】deployment does not have minimum availability
  18. Kerberos (一) --------- Kerberos 部署
  19. (19)一篇掌握MySQL数据库基础下 基本操作(外键约束、建表原则、多表查询、子查询)
  20. Python 修改文件名加前缀

热门文章

  1. ping命令工具:同时ping多个IP
  2. Web的现状:网页性能提升指南
  3. 《Ansible权威指南 》一 第一篇 Part 1 基础入门篇
  4. elastaticsearch 5.1.2 x-pack 设置权限访问
  5. Java三大主流框架概述
  6. 【Win10 应用开发】语音命令与App Service集成
  7. 整数展示分数和整形数的四则运算
  8. 想挖矿?不如先学习一下以太坊
  9. 编写文档_如何通过编写优质文档来使自己的未来快乐
  10. ios 应用和电脑共享文件夹_堪比AirDrop,苹果 iPhone与Windows电脑互传文件的三种方式...