结构体内存对齐

例子

定义两个成员个数相同(3个成员)且成员类型相同(int、char、short)的但是成员顺序不同的两个结构体:

typedef struct {
     int i;
     char c;
     short a;
   }FOO1;

typedef struct {
    char c;
    int i;
    short a;
  }FOO2;

FOO1 a1;
FOO2 b1;

使用sizeof()测试结构体a1b1的大小:

sizeof(a1) = 8
sizeof(b1) = 12

可以看到,两个结构体占用的字节大小不同,为什么成员相同的两个结构体的大小不一样呢?这是因为字节对齐的问题。将两个结构体格成员相对于结构体的起始地址打印出来:

&a1.i --> 0
&a1.c --> 4
&a1.a --> 6

&b1.c --> 0
&b1.i --> 4
&b1.a --> 8

内存对齐主要遵循三个规则

  • 结构体变量的起始地址能够被其最宽的成员大小整除。
  • 结构体每个成员相对于起始地址的偏移地址能都被其自身大小整除,若果不能,则在其前面一个成员后面补充字节。
  • 结构体字节大小能够被最宽的成员的大小整除,如果不能则在后面补充字节。

参考:C语言字节对齐问题详解

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 引言 C语言结构体内存布局是一个老生常谈的问题,网上也看了一些资料,有些说的比较模糊,有些是错误的。本人借鉴了前人...
    boborz阅读 4,683评论 0 2
  • 源网址[英文] github上有大神翻译了一篇内存对齐的英文文献,我复现了一下过程; 发现其中有个地方有出入(st...
    十曰立阅读 4,873评论 0 3
  • 4.3:新增class的相关内容 今天看到一个题目: 最开始简单的理解为,每个数据的size之和就是偏移量。因为偏...
    AwesomeAshe阅读 4,200评论 0 0
  • 作者:Eric S. Raymond转自:https://github.com/ludx/The-Lost-Art...
    FlyingReganMian阅读 5,090评论 0 4
  • 转载 结构体对齐详解 结构体数据成员对齐的意义 许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会...
    erU阅读 3,311评论 0 3