c语言结构体嵌套的对齐方式

原创 2018年04月16日 11:05:05

1:在代码中有结构体嵌套的方式,又需要获取每个变量的地址。那么需要了解结构体嵌套和单一结构体的一些对齐方面的规则。

2:对于嵌入式的设备来说,对齐很重要,有些cpu不支持不对齐的访问方式,有的cpu支持,只是效率上会降低。

3:arm中默认编译的时候会进行对齐。

规则一:结构体中的第一个成员位置在偏移量0,之后每个变量的偏移量必须是它本身字节数的整数倍。

规则二:如果结构体中嵌套结构体,那么嵌套的结构体的偏移量必须是它最大成员的字节数的整数倍。

规则三:结构体的总偏移量必须是它最大成员字节数的整数倍(包括嵌套的结构体中的最大成员)。

如果一个结构体B里嵌套另一个结构体A,还是以最大成员类型的字节对齐,但是结构体A存储起点为A内部最大成员整数倍的地方。(struct B里存有struct A,A里有char,int,double等成员,那A应该从8的整数倍开始存储。),结构体A中的成员的对齐规则仍满足自身的规则 
注意: 
1)结构体A整体所占的大小为该结构体成员内部最大元素的整数倍,不足补齐。 
2)不是直接将结构体A的成员直接移动到结构体B中。

一些特殊情况

其实对于4字节对齐,如果含有嵌套结构体,那么嵌套结构体本身也是4字节对齐,那么最后一个是32bit数据就没有问题。因为之前的都会补上。

如果嵌套的结构体只有一个数据,那么不管是16bit还是32bit,都不会有问题。因为类似于直接插入到结构体中,不存在本身的对齐问题

如果嵌套结构体最后是16bit,四字节对齐,那么如果没有对齐,后面要补一个16bit,如果后面接着的变量是32bit的,那么数据库中的也是对的,因为本来16bit接一个32bit也需要补,正好嵌套结构体本身补了一个。

如果嵌套结构体都是16bit,结构体后面跟的也是16bit,那么其实前面的结构体都是2 byte对齐,不需要补,所以连接下面的时候相当于直接连接,如果后面跟的是32bit的数据。那么可能会因为地址不是4的倍数而补齐。

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wangbinyantai/article/details/79956122

C语言系列之 字符串压缩算法与结构体初探

-
  • 1970年01月01日 08:00

C语言深度解剖读书笔记(3.结构体中内存对齐问题)

很多人都觉得内存对齐这个问题很难,很不好算,总算错,其实我想说只要你画一画就没那么难了。好了,进入正题。 本节知识点: 1.结构体为什么要内存对齐(也叫字节对齐): 其实我们都知道,结构体只是一...
  • qq418674358
  • qq418674358
  • 2013-08-24 00:28:07
  • 6527

结构体struct 联合体union 及内存对齐

原文链接:http://blog.csdn.net/coolingcoding/article/details/7278555 当在C中定义了一个结构类型时,它的大小是否等于各字段(...
  • Aiphis
  • Aiphis
  • 2015-09-24 10:33:43
  • 2868

C语言字节对齐、结构体对齐最详细的解释

文章最后本人做了一幅图,一看就明白了,这个问题网上讲的不少,但是都没有把问题说透。   一、概念       对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就...
  • lanzhihui_10086
  • lanzhihui_10086
  • 2015-03-17 21:57:58
  • 12803

C语言结构中的边界对齐问题

没错,今天2月14,单身狗如我情人节也只能苦逼地撸代码了。不知道大家有没有发现一个奇怪的现象,见图~ 结构test里面包含了1个int型变量和2个char型变量,照理说sizeof...
  • qq_37521235
  • qq_37521235
  • 2017-02-14 23:56:56
  • 1113

C语言结构体对齐与不对齐设置总结

参考: 相信不同的编译平台间的默认设置差异给大家带来了很多困扰。在此,仅就结构体对齐解析下之间的差异设置方法。 1.gcc中结构体默认是4个字节对齐,即为32的倍数。 1.1修改字节...
  • gll028
  • gll028
  • 2014-10-08 17:33:06
  • 3210

c语言结构体边界对齐

通常情况下, 在x86体系结构的系统上定义一个结构体的时候, 编译器会自动将结构体中的成员按4字节对齐的方式存储。 例如: struct st_tst { int a; char b; ...
  • LIUXINKUN
  • LIUXINKUN
  • 2011-08-03 13:28:26
  • 527

结构体和联合体的字节对齐问题

为了提速之类的,在结构体和联合体的内存块中,是按照一定的规则安排的 联合体: 联合体的内存不会为了所有成员安排,而是只取最大的成员的所需内存大小,每次只能使用其中一个成员。但是有一个问题: ty...
  • u013400743
  • u013400743
  • 2016-03-20 16:56:20
  • 1287

C语言(地址对齐和结构体大小)

结构体的大小取决于每个成员的大小以及他们的地址对齐要求,由于地址需要对齐,因此结构体内部一般都存在填充现象。   拓展: 变量的地址需要对齐意味着:在内存中开辟一块空间(即变量)的时候,并不是随...
  • vincent040
  • vincent040
  • 2016-01-31 13:12:28
  • 1528

c语言地址对齐方法

在读nginx的内存分配方面的代码时,发现了其按指定大小(16字节)的数据对齐方式进行内存分配的巧妙方法。 代码如下: #define NGX_ALIGNMENT 16  m = ngx_align_...
  • angelina525
  • angelina525
  • 2013-08-28 22:50:34
  • 814
收藏助手
不良信息举报
您举报文章:c语言结构体嵌套的对齐方式
举报原因:
原因补充:

(最多只允许输入30个字)