结构体内存对齐原理和练习

内存对齐遵循的原则

  1. 内存分配按照结构体中声明的顺序来分配
  2. 整个结构体内存对齐的时候, 是以结构体中占用字节最大的那个数据类型的长度对齐的.
举例详解
struct {
    short a;
    int c;
} test1;

struct {
    short a;
    short b;
    int c;
} test2;

struct {
    short a;
    short b;
    int c;
    short d;
} test3;

int main()
{
    cout << sizeof(test1) << endl;   // 8
    cout << sizeof(test2) << endl;   // 8
    cout << sizeof(test3) << endl;   // 12
    return 0;
}

看上去很难理解为什么, 但是把图画出来, 就非常容易理解了
test1:
在这里插入图片描述
test2:
在这里插入图片描述
test3:
在这里插入图片描述

这样画图, 是不是就非常容易理解了.

  1. test1: 按照顺序分配内存, 所以首先给short分配两个字节, 然后int后续占用4个字节, 一共6个字节, 但是最终对齐的时候, 是要按照test1中最大的数据类型长度对齐的, 也就是int的长度: 四个字节, 虽然short只占两个字节, 但是要对其, 所以补位了两个字节
  2. test2: 和test1一样, 只不过补位的字节, 用short给占用了
  3. test3: 在test2的基础上, 最后多了一个short, 所以新占用一行4个字节, 虽然只占用2个字节, 但是为了对齐, 还是会补位2个字节

整点有难度的拓展

struct嵌套union
对union共享内存不了解的, 看下这个, 其实就是内存对齐后, 选择最大的那个变量的内存
union内存分配详解

struct
{
    int n1;
    union u
    {
        char c[17];
        int n2;
    }u1;
    int n3;
    double d1;
}test1;


int main()
{
    cout << sizeof(test1) << endl;  // 40
    return 0;
}

内存分布图如下
在这里插入图片描述

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值