结构体内字节手动对齐(#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.

在程序运行过程中,结构体或类的字节对齐可以使程序更方便、更快速的执行,除了编译器本身的优化外,还可以在程序中手动对齐。在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.


相关文章

  • C语言运算符的优先级
  • 运算符及其优先级 运算符 [] 1 () . -> - 名称或含义 数组下标 圆括号 负号运算符 使用形式 数组名[常量表达式] 对象.成员名 对象指针->成员名 -表达式 (数据类型)表达式 ++变量名/变量名++ --变量名 ...查看


  • golang: 利用unsafe操作未导出变量
  • 发表于16天前(2014-01-17 05:03)   阅读(388) | 评论(4) 5人收藏此文章,我要收藏 赞5 摘要 unsafe.Pointer其实就是类似C的void *,在golang中是用于各种指针相互转换的桥梁.uintp ...查看


  • iOS求职之OC面试题
  • 1.Objective-C的类可以多重继承么?可以采用多个协议么? 答:不可以多重继承,可以采用多个协议. 2.#import和#include的区别是什么?#import 跟 #import""有什么区别? #impo ...查看


  • iOS常见面试题总结
  • 1.objective-c常见面试题: 1.OC 语言的基本特点 OC 语言是 C 语言的一个超集,只是在 C 的基础之上加上了面向对象(oop) 的特性; OC 与 Java 语言相同都是单继承,这一点与 C++语言不同(多重继承); O ...查看


  • 2014计算机文化基础知识点
  • 计算机文化基础知识点 第一章 信息技术与计算机文化 1. 2. 3. 4. 5. 6. 7. 8. 9. <逻辑的数学分析>一书是19世纪中叶英国数学家布尔的著作 布尔提出了符号逻辑思想 控制论创始人美国数学家维纳认为:信息使我 ...查看


  • 水箱水位控制系统设计
  • 辽 宁 工 业 大 学 单片机原理及接口技术课程设计(论文) 题目:水箱水位控制系统设计 院(系): 专业班级: 学 号: 学生姓名: 指导教师: 起止时间:2011-7-至2011-12-31 辽 宁 工 业 大 学 课 程 设 计 说 ...查看


  • 水箱单片机控制系统
  • ※※※※※※※※※ ※2013级学生单片机 ※ ※ ※※ 课程设计 ※ ※※※※※※※※※ 单片机课程设计报告书 课题名称 姓 名 学 号 院.系.部 专 业 指导教师 2015年9月1日 ********* *** ********** ...查看


  • 水塔水箱水位自动控制器
  • 扬州工业职业技术学院 2009 -2010学年 第 二 学期 毕业论文 课题名称: 水塔水箱水位自动控制器的设计 设计时间: 2010.02.01-2010.05.21 系 部: 电子信息工程系 班 级: 姓 名: 指导教师: 总目录 第一 ...查看


  • 计算机应用基础
  • <计算机应用基础>复习题 一. 单项选择题: (1) 一个完整的计算机系统应包括_C _. A) 主机.键盘.显示器 B) 计算机及其外部设备C) 系统软件和应用软件 D) 硬件系统与软件系统 (2) 第三代计算机的逻辑器件采用 ...查看


热门内容