C++中结构体、公用体在内存单元占用字节数计算

一 数据类型所占存储空间对比

数据类型 64位机 32位机 char 1个字节 1个字节 short 2个字节 2个字节 int 4个字节 4个字节 long 8个字节 4个字节 float 4个字节 4字节 double 8个字节 8个字节 long long 8个字节 8字节

二 union字节计算

1 代码

#include<iostream>
using namespace std;
union A{
   int a[5];
   char b;
   double c;
};
int main(){
   cout<<sizeof(A)<<endl;
   return 0;
}

2 运行

[root@localhost charpter01]# g++ 0114.cpp -o 0114
[root@localhost charpter01]# ./0114
24

3 说明

union中变量同用内存,应以最长的为准,可是结果不是预想的20(5*4),这是因为公用体中变量的默认内存对齐方式,必须是以最长的double(8byte)对齐,也就是说应该是sizeof(A)=24.所以将公用体中int a[5]修改为int a[6]后,结果还是24.但是,如果将int a[5]修改为int a[7],结果将变成32.

三 struct的字节数计算

1 代码

#include<iostream>
using namespace std;
struct B{
  char a;
  double b;
  int c;
}test_struct_b;
int main(){
   cout<<sizeof(test_struct_b)<<endl;
   return 0;
}

2 运行

[root@localhost charpter01]# g++ 0115.cpp -o 0115
[root@localhost charpter01]# ./0115
24

3 说明

这是因为char a的偏移量为0,占用1个byte,double b指的下一个可用的地址偏移量为1,不是sizeof(double)=8,需要补足7byte才能满足double的8字节对齐。

int c指的是下一个可用的地址偏移量16,是sizeof(int)=4的倍数,满足int的对齐方式。

故所有成员变量都分配了空间,总空间大小是1+7+8+4=20,不是结构的节边界数(即结构中占用最大空间的类型所占用字节数sizeof(double)=8)的倍数,所以需要填充4个字节,以满足结构的大小为sizeof(double)=8的倍数,即24.

四 一个混合结构体大小的计算

1 代码

#include<iostream>
using namespace std;
typedef union{
    long i;
    int k[5];
    char c;
} UDATE;
struct data{
    int cat;
    UDATE cow;
    double dog;
}too;
UDATE temp;
int main(){
    cout<<sizeof(struct data)+sizeof(temp)<<endl;
    cout<<sizeof(struct data)<<endl;
    cout<<sizeof(temp)<<endl;
    return 0;
}

2 运行

[root@localhost charpter01]# g++ 0116.cpp -o 0116
[root@localhost charpter01]# ./0116
64
40
24

3 说明

sizeof(temp)=24在以前示例中已经解释。

我们看看sizeof(struct data)的计算。cat占用4个字节,cow占用24个字节。因为cow是8字节对齐,所以cat后要填充4个字节,即cat和cow共占用4+4+24=32字节。

dog占8字节,从32字节开始,已对齐,所以共40个字节。

经验分享 程序员 微信小程序 职场和发展