• C/C++ 结构体内存分布


    参考文章:C++中的结构体所占内存空间总结 - fengMisaka - 博客园 (cnblogs.com)

    在C C++中,一般情况下。struct 的 sizeof 是所有成员字节对齐后长度相加,而 union 的 sizeof 是取最大的成员长度,再相加。

    字节对齐的细节和编译器实现相关,但一般而言,满足以下3个准则:

    (1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除。

    (2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是当前成员大小的整数倍,如有需要编译器会在成员之间加上填充字节。

    (3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。

    需要注意的是,基本类型是指前面提到的像 char、short、int、float、double 这样的内置数据类型。如果一个结构体中包含另外一个结构体成员,那么此时最宽基本类型成员不是该结构体成员,而是取基本类型的最宽值。

    (均以32位机为例,Int型4字节,long 4字节,long long 8字节。其实4字节还是8字节不止和平台有关,编译器也会影响)

    几种可能的情况:
    1.全部为同一种基础类型:

    typedef struct
    {
        char ch1;   
        char ch2;
        char ch3;
    }  //成员均为1,不用补齐,总大小为3

    2.有不止一种基础类型

    typedef struct
    {
       int num;  //占用4 字节
        char b;  //占用1字节,补齐到4字节
    }
    //总共8字节
    typedef struct
    {
        char a; //占用1字节,补齐到4字节
        int b;  //占用4字节
        long long c;  //占用8字节
        char d;  //1字节,但要补齐到c的倍数,即总共24字节
    }

    32位机指针大小4字节

    typedef struct
    {
         long num; //4
        char *num; //8
        short int data; //10
        char d; //11字节,但需要补齐到4的倍数,共12字节
    }

    3. 使用了#pragma pack(n)指令

    这个指令会强制要求编译器放弃字节对齐,而是要求按照n个字节对齐。但如果大于所有成员的长度,n不会起作用

    #pragma pack(1)
    
    
    typedef struct
    {
        char a;   //1
        int b;   //占用2-5
        int c;  //占用6-9
    }
    //总共占用9字节
  • 相关阅读:
    用心合作
    添加IE右键菜单 以 调用和运行 自己的程序或文件
    VS2005 My.Computer.Registry 对象 操作注册表 简单示例
    项目经理职业生涯
    Visual studio.NET单元测试中Assert类的用法(转载)
    如何正确理解自动化测试?(转载)
    浅析ASP.NET单元测试中的调试(转载)
    软件项目质量管理实战总结(转)
    主题:小公司如何做项目管理(转)
    什么是“极限编程”?(转载)
  • 原文地址:https://www.cnblogs.com/namezhyp/p/16244640.html
Copyright © 2020-2023  润新知