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字节

 

posted @ 2022-05-08 00:25  namezhyp  阅读(71)  评论(0编辑  收藏  举报