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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chengqiuming/article/details/89735579

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

数据类型

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

猜你喜欢

转载自blog.csdn.net/chengqiuming/article/details/89735579
今日推荐