• sizeof 计算 struct 占字节数的方法总结


    矛盾焦点:

    1、结构体的内存对齐方式

    字节对齐的目的:

    1、提高CPU存储变量的速度

    计算的核心点(默认对齐方式):

    1、结构体内的每一个成员的起始地址跟结构体起始地址的偏移量要刚好是自己字节数的整数倍,不足则自动填充。

    2、结构体总的字节大小要刚好是结构体的字节边界数的倍数,不足则自动填充。(字节边界数:结构体中占用最大空间的类型的字节数)

    3、static修饰的结构体成员不占用结构体字节数,因为静态变量的存储地址跟结构体的实例地址无关。

    4、空结构体的字节数为1,因为必须保证结构体的实例地址唯一。

    计算的核心点(#pragma pack设置字节对齐大小):

    #pragma pack(push)

    #pragma pack(n)

    ...

    #pragma pack(pop)

    一、结构体每个成员的地址偏移量

    1、如果n大于等于当前成员的字节数,则当前成员的地址偏移量要刚好是自己字节数的整数倍,不足则自动填充。

    2、如果n小于当前成员的字节数,则当前成员的地址偏移量要刚好是n的整数倍,不足则自动填充。

    二、结构体总的字节数

    1、如果n大于等于结构体中占用最大空间的类型的字节数,则结构体总字节数大小要刚好是结构体中占用最大空间的类型的字节数的整数倍。

    2、如果n小于结构体中最大空间的类型的字节数,则结构体总字节数的大小要刚好是n的整数倍。

    计算的核心(补充):

    1、static修饰的结构体成员不占用结构体字节数,因为静态变量的存储地址跟结构体的实例地址无关。

    2、空结构体的字节数为1,因为必须保证结构体的实例地址唯一。

    //try 一 try
    
    struct F
    {
        char a;
        short b;
        double c;
        float d;
        char e;
    };
    int FCount = sizeof(F);
    cout << "F count = " << FCount << endl;  //F count = 24
    
    #pragma back(push)
    #pragma pack(2)
    struct E
    {
        char a;
        short b;
        double c;
        float d;
        char e;
    };
    #pragma back(pop)
    
    int ECount = sizeof(E);
    cout << "E count = " << ECount << endl;  //E count = 18

    //n大于等于结构体所占最大空间的类型的字节数的情况,按照默认对齐方式处理

    上述代码有一个疑问点:https://www.cnblogs.com/azbane/p/11299354.html

    //try 一 try
    struct FF
    {
        char a;
        short b;
        double c;
        float d;
        char e;
        static double h;
    };
    
    int FFCount = sizeof(FF);
    cout << "FF count = " << FFCount << endl;  //FF count = 24
    
    struct G
    {
    
    };
    int GCount = sizeof(G);
    cout << "G count = " << GCount << endl;  //G count = 1

    追加:类类型占据字节数跟结构体的计算方法一致。

  • 相关阅读:
    TcxComboBoxProperties下拉框填充
    Delphi用QJSON解析JSON格式的数据 【转】
    Delphi的idhttp报IOHandler value is not valid错误的原因[转]
    RelayCommand
    ViewModelBase && ObservableObject
    MvvmLight ToolKit 教程
    WPF中的数据验证
    MvvmLight ToolKit .Net4.5版本 CanExecute不能刷新界面bug
    微软虚拟学院MVA 字幕获取方法
    WPF Binding INotifyPropertyChanged 多线程 深入理解
  • 原文地址:https://www.cnblogs.com/azbane/p/11299353.html
Copyright © 2020-2023  润新知