<C 结构体><1>字节对齐

字节对齐 – 关于结构体占多大内存问题讨论

什么是字节对齐

计算机是以2, 4, 8的倍数的字节块来读写内存

这样可以对基本数据类型的合法地址作出一些限制

要求各种数据类型按照一定的规则在空间上排列

为什么要考虑字节对齐

通常情况编译器帮助我们进行对齐, 不需我们考虑

但是, 我们可以优化程序的运行

并且可以避免某些错误

结构体的字节对齐

  1. 对于跨平台通信时可能导致结构体大小不同, 导致乱码

    需要考虑 统一 字节对齐

  2. 可以合理的规划空间大小, 节省空间, 提高运行效率

    例子如下

#include "stdio.h"

typedef struct s1
{
    long double a;//16个字节
    int b;//4字节
    int c;//4字节
}s1_t;

typedef struct s2
{
    int b;//4字节
    long double a;//16个字节
    int c;//4字节
}s2_t;

int main()
{
    s1_t structure1;
    printf("address of structure1 : %d\n",&structure1);
    printf("address of a : %d\n",&structure1.a);
    printf("address of b : %d\n",&structure1.b);
    printf("address of c : %d\n",&structure1.c);
    printf("size of s1_t : %d\n\n", sizeof(structure1));

    s2_t structure2;
    printf("address of structure2 : %d\n",&structure2);
    printf("address of b : %d\n",&structure2.b);
    printf("address of a : %d\n",&structure2.a);
    printf("address of c : %d\n",&structure2.c);
    printf("size of s2_t : %d\n\n", sizeof(structure2));

    return 0;
}


/**
 * 程序运行结果如下
 */
PS F:C> gcc .\struct.c
PS F:C> .\a.exe       
address of structure1 : 6487552
address of a : 6487552
address of b : 6487568
address of c : 6487572
size of s1_t : 32

address of structure2 : 6487504
address of b : 6487504
address of a : 6487520
address of c : 6487536
size of s2_t : 48

对齐原则

  1. 总体大小最大成员整数倍
  2. 每个成员 相对于结构体 首地址偏移量 都是 该成员 大小的 整数倍
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青蓝灰紫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值