一 数据类型所占存储空间对比
数据类型 | 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个字节。