我是靠谱客的博主 无心花瓣,最近开发中收集的这篇文章主要介绍结构体内存对齐的要素--数据成员对齐的规则,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Data structure alignment refers to the way data is arranged and accessed in computer memory. It consists of three separate but related issues: data alignmentdata structure padding, and packing.

 

padding = (align - (offset mod align)) mod align
aligned = offset + padding
= offset + ((align - (offset mod align)) mod align)

 

packing:对齐因子

The #pragma pack directive can only be used to reduce the packing size of a structure from the project default packing.

https://en.wikipedia.org/wiki/Data_structure_alignment

 

结构体的内存布局依赖于CPU、操作系统、编译器及编译时的对齐选项。结构体内部成员的对齐要求,结构体本身的对齐要求。最重要的有三点

(一)成员对齐。对于结构体内部成员,通常会有这样的规定:各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。但是也可以看到,有时候某些字段如果严格按照大小紧密排列,根本无法达到这样的目的,因此有时候必须进行padding。各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调整位置,空缺的字节编译器会自动填充也就是padding。

(二)然后,还要考虑整个结构体的对齐需求。ANSI C标准规定结构体类型的对齐要求不能比它所有字段中要求最严格的那个宽松,可以更严格。实际上要求结构体至少是其中的那个最大的元素大小的整数倍。因为有时候我们使用的是结构体数组,所以结构体的大小还得保证结构体数组中各个结构体满足对齐要求,同时独立的结构体与结构体数组中单个结构体的大小应当是一致的。

(三)编译器的对齐指令。VC 中提供了#pragma pack(n)来设定变量以n字节对齐方式。n字节对齐就是说变量存放的起始地址的偏移量有两种情况:第一、如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式,第二、如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式。结构的总大小也有个约束条件,分下面两种情况:如果n大于所有成员变量类型所占用的字节数,那么结构的总大小必须为占用空间最大的变量占用的空间数的倍数。

http://www.cnblogs.com/kevinLee-xjtu/archive/2011/12/12/2299090.html

 

首先我们要清楚结构体 struct中的成员在内存中的分配是连续的, struct内的首地址也就是 struct内第一个数据成员的地址,换句话说 struct内第一个数据成员离 struct开始的距离 offset = 0
   数据成员对齐的规则就是,而在第一个成员之后,每个成员距离struct首地址的距离 offset, 都是struct内成员自身长度(sizeof) 与 #pragma pack(n)中的n的最小值的整数倍,如果未经对齐时不满足这个规则,在对齐时就会在这个成员前填充空子节以使其达到数据成员对齐。


作者:null122
链接:https://www.jianshu.com/p/49ddb946a226
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

转载于:https://www.cnblogs.com/feng9exe/p/10060033.html

最后

以上就是无心花瓣为你收集整理的结构体内存对齐的要素--数据成员对齐的规则的全部内容,希望文章能够帮你解决结构体内存对齐的要素--数据成员对齐的规则所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(31)

评论列表共有 0 条评论

立即
投稿
返回
顶部