• c语言struct结构体的字节对齐


    struct MyStruct
    {
        short a[3];
    };
    

    结构体大小为6,每个short是2个字节,3个正好是6

    struct MyStruct
    {
        char a[3];
    };
    

    结构体大小为3,每个char是1个字节,3个正好是3

    struct MyStruct
    {
        short a;
        int b;
    };
    

    结构体大小为8,a占用2个,填充2个,b占4个

    struct MyStruct
    {
        char a;
        short b;
        int c;
    };
    

    结构体大小为8,a占用1个,填充1个,b占用2个,c占用4个

    struct MyStruct
    {
        char a;
        int b;
        short c;
    };
    

    结构体大小为12,a占用1个,填充3个,b占4个,c占2个,填充2个

    struct MyStruct
    {
        int a;
        short b;
        char c;
    };
    

    结构体大小为8,a占4个,b占2个,a占1个,填充1个

    struct MyStruct
    {
        char a;
        char a1;
        char a2;
        short b;
        int c;
    };
    

    结构体大小为12,a a1 a2各占1个,后面填充1个,b占2个,填充2个,c占4个

    struct MyStruct {
        int a;
        INT64 b;
        char c;
    };
    struct MyStruct1 {
        char a[2];
        int b;
        INT64 c;
        short d;
        struct MyStruct e;
    };
    

    MyStruct:结构体大小为24,a占用4,填充4,b占用8,c占用1,填充7
    MyStruct1:结构体大小为48,a占用2,填充2,b占用4,c占用8,d占用1,填充7,e占用24。第一个变量a,如果是char a[1]到char a[4],结构体大小都不会变化。

    struct MyStruct
    {
        int a;
        int *b;
    };
    struct MyStruct1
    {
        int a;
        struct MyStruct b;
    };
    

    MyStruct:结构体大小是16(64位系统),a占用4,填充4,b是指针,占用8
    MyStruct1:结构体大小是24,a占用4,填充4,b占用26

    看到上面这些例子,可能有点懵了,不过数据对齐是有规则的:

    1. 结构体中第一个变量起始偏移量是0
    2. 结构体中的其他变量起始偏移量是其类型大小的倍数,换句话说,变量只能从其大小倍数的偏移地址开始存放。比如第一个是char,第二个int(4字节),只能从0,4,8等等存放,所以char后面填充3个字节,int从4的位置放,那么大小就是8。实际上也不算填充,就是放在那里不用,跳过对应的空间存放。
    3. 结构体嵌套结构体,那么嵌套结构体的起始偏移量要从其内部最大的变量的整数倍数位置开始,不能把结构体看做一个整体。
    4. 结构体的总大小,是其中最大基础变量的倍数(嵌套的结构体不能看做整体)。意思就是如果最后是一个char等小的字节变量,末尾也要填充,把结构体凑成最大变量的倍数大小。

    根据这个规则,再看上面的示例,就可以清除的知道结构体的大小和每个位置为什么需要填充。

    具体对齐填充的原因,是由于内存cpu等设计导致的,详细内容再做介绍。

  • 相关阅读:
    超详细从零记录Hadoop2.7.3完全分布式集群部署过程
    hadoop学习之hadoop完全分布式集群安装
    Fine-tune with Pretrained Models
    Module
    Symbol API
    Gluon parameters 和 Blocks 命名
    mxnet 数据读取
    Adversarial Latent Autoencoders
    A New Meta-Baseline for Few-Shot Learning
    Deploy a plain HTTP registry
  • 原文地址:https://www.cnblogs.com/studywithallofyou/p/16690114.html
Copyright © 2020-2023  润新知