下面两个结构体

struct One {double d;char c;int i;
}struct Two {char c;double d;int i;
}

在#pragma pack(4)和#pragma pack(8)的情况下,结构体的大小分别是: 16 16 16 24.

分析:

许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值是某个数k(通常它为4或8)的倍数,这就是所谓的内存对齐。

每个特定平台上的编译器都有自己的默认“对齐系数”(32位机一般为4,64位机一般为8)。我们可以通过预编译命令#pragma pack(k),k=1,2,4,8,16来改变这个系数,其中k就是需要指定的“对齐系数”;也可以使用#pragma pack()取消自定义字节对齐方式。

struct 或者 union 成员对齐规则如下:

1. 第一个数据成员放在offset为0的地方,对齐按照对齐系数和自身占用字节数中,二者比较小的那个进行对齐;

2. 在数据成员完成各自对齐以后,struct或者union本身也要进行对齐,对齐将按照对齐系数和struct或者union中最大数据成员长度中比较小的那个进行;

先局部成员对齐,然后再全局对齐。

转载于:https://www.cnblogs.com/dd2hm/p/7227668.html

6.pragma pack相关推荐

  1. #pragma pack(n) 的作用

    在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int.long.float等)的变量,也可以是一些复合数据类型(如数组.结构.联合等)的数据单元.在结构中,编译器为结构的每个成 ...

  2. #pragma pack 内存对齐

    1. 用法 #pragma pack是C/C++里面设置字节对齐方式的预编译函数 2. 解释 先看下面代码: #include <iostream> using namespace std ...

  3. C语言中 #pragma pack()

    #pragma  pack 这条指令主要用作改变编译器的默认对齐方式. pragma pack(show)      //显示当前内存对齐的字节数,编辑器默认8字节对齐     #pragma pac ...

  4. #pragma pack的作用

    #pragma pack 当#pragma pack指定的值等于或者超过所有数据成员长度的时候,这个指定值的大小将不产生任何效果: 一句话: 如果是1的话表示紧凑存放,除了char,bool,每个都要 ...

  5. 基础 - #pragma pack (n) 设置对齐方式

    1 // pragma_pack.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 #include <windows. ...

  6. #pragma pack

    #pragma pack(4) class TestB { public: int aa; char a; short b; char c; }; int nSize = sizeof(TestB); ...

  7. 使用伪指令#pragma pack

    在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int.long.float等)的变量,也可以是一些复合数据类型(如数组.结构.联合等)的数据单元.在结构中,编译器为结构的每个成 ...

  8. #pragma pack(1)的作用

    #pragma pack(n) 解释一: 每个特定平台上的编译器都有自己的默认"对齐系数"(也叫对齐模数).程序员可以通过预编译命令#pragma pack(n),n=1,2,4, ...

  9. 结构对齐--__packed与#pragma pack

    1.ANSI C规定 ANSI C规定一种结构类型的大小是它所有字段的大小以及字段之间或字段尾部的填充区大小之和. 填充区就是为了使结构体字段满足内存对齐要求而额外分配给结构体的空间. 那么结构体本身 ...

  10. 结构体对齐,#pragma pack

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

最新文章

  1. Windows文件系统过滤驱动开发教程(4,5)
  2. 如何在Excel中使用VB宏连接SAP系统
  3. Traceback (most recent call last)AttributeError: ‘NumpyArrayIterator‘ object has no attribute ‘ndim‘
  4. android 自定义switch控件,Android中switch自定义样式
  5. 侯捷面向对象高级编程(二)
  6. 漫画:程序员战力图鉴
  7. Wiz Editor md 为知笔记 Markdown 插件
  8. 怎么样采集声音的波形和频率_示波器采集模式
  9. ARP协议具体解释之Gratuitous ARP(免费ARP)
  10. PHP array(递归)转xml,xml转array
  11. 线性回归、二次回归、随机采样一致性ransac的数据拟合
  12. Spring的注入方式中,官方推荐哪种方式
  13. 一道简单的CTF社工题思路
  14. Telink blt_soft_timer 改进
  15. ES6语法及vue复习
  16. ceph 删除 osd
  17. 【数据清理与特征工程】2-数据清理
  18. 未来,能源枯竭可以逆转吗?
  19. qt打开xls文件_Qt中打开excel文件
  20. 每页多张幻灯片密集打印的设置技巧

热门文章

  1. 一些VC的快捷键以及调试技巧
  2. 3个人的java 实验_20165104-JAVA第三次实验
  3. php用win还是linux系统,做网站选择linux系统还是选择windows系统好?
  4. 【女生节】圆周率小数点后37373737位中,“37”出现的次数是?
  5. 文档服务器archive,文档查询服务器,archive server,音标,读音,翻译,英文例句,英语词典...
  6. linux ssh客户端_Linux终端连接Linux服务器
  7. 测试mysql的查询速度很慢_求助,mysql统计实时数据信息的,查询速度很慢?
  8. c++ 调用python_闲话python 48: C/C++扩展Python与Swig工具
  9. 贪心法——LeetCode 402 移除K个数字
  10. OpenGL基础24:聚光灯