数据结构 计算结构体大小

时间:2024-02-22 16:59:26

一、规则:

操作系统制定对齐量:

64位操作系统,默认8Byte对齐

32位操作系统,默认4Byte对齐

结构体对齐规则:

1.结构体整体的大小,需要是最大成员对齐量的整数倍

2.结构体中每一个成员的偏移量需要存在其对齐量整数倍的位置

3.成员的对齐量=成员本身的大小<操作系统对齐量?成员本身的大小:操作系统指定对齐量

(若成员大小>8,就取8,若成员大小<8,就取成员大小)

二、数据类型

类型                    所占空间大小

int                              4B

short int                     2B

long int            64: 8B       32:4B

long long                   8B

float                           4B

double                       8B

*p                   64:8B        32:4B

三 、实例(默认都为64位)

1.

typedef struct Test
{
    int a;  
    char c;
    double b;
    long int p;
}T;

成员对齐量=8B

解析:其中最大的为long int为8B

大小=24B

2.

typedef struct Stu
{
    char name[5];  
    int age; 
    char sex; 
    double score; 
}S;   

成员对齐量为:8B

大小=24B

3. 

typedef struct A
{
    long int a;  
    short b;    
    int *p;   
    float q;  
}A;  

成员对齐量=8

大小=32B

4.

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

成员对齐量=4B

解析:结构体最大的是int型,为4B

成员本身的大小<操作系统指定对齐量,4<8,所以成员对齐量=4B

大小=12B

5.结构体嵌套(先计算内部结构体,将内部的结构体对齐,再计算外部)

typedef struct Test{
    short a;
    struct {
        int b;
        double c;
        char d;
    }p;
    int e;
}Test;

成员对齐量=8B

大小=40B

6.

typedef struct Test {
    short a;
    struct {
        int b;
        double c[10];
        char d;
    };
    int e;
}Test;

成员变量=8B

大小=112B

7.指定对齐字节(#pragma pack() ,()中只能是2的幂次)

#pragma pack(2)   //指定二字节对齐,()中只能是2的幂次
typedef struct
{
    char c;  
    struct A
    {
        short a; 
        int *b;  
        char c; 
    }p;  
    long b;  
    int a;  
}T; 
#pragma pack() //取消指定对齐

成员对齐量=2B

大小=26B