常见数据类型下的sizeof总结
前言
很久没有好好总结一下了,最近重新学C++,就从基础开始整理吧
一、常用的的sizeof
1 byte = 8 bit
类型 | sizeof |
---|---|
char | 1 byte |
short | 2 byte |
int | 4 byte |
long | 4 byte |
float | 4 byte |
double | 8 byte |
long long | 8 byte |
二、数组的sizeof
数组的sizeof值等于数组所占用的内存字节数
1、char数组的sizeof
char a[] = {'0','1'}; //sizeof(a) = 2
//""括起来的内容末尾补'\0'
char b[] = "01"; //sizeof(b) = 3 因为 b[]="01" 也就是 b[]={'0', '1', '\0'}
2、int数组的sizeof
int a[] = {0, 1, 2, 3}; //sizeof(a) = 4*4 = 16byte
3、string数组的sizeof
//64位机器上
string a[] = {"a", ""}; //sizeof(a) = 64byte
//可以推断string b = "" 且 sizeof(b) = 32byte,经过验证是正确的
三、 指针的sizeof
在32位计算机中,sizeof的结果位 4 byte;在64位系统中,sizeof的结果为 8 byte。
char *a; //sizeof(a) = 8 byte
int *b; //sizeof(b) = 8 byte
long *c; //sizeof(c) = 8 byte
double *d; //sizeof(d) = 8 byte
void (*e)(); //函数指针:sizeof(e) = 8 byte
//指针数组:sizeof() = 指针内存大小 * 元素个数
char *f[5]; //指针数组:sizeof(f) = 8*5 = 40 byte
float **g; //多级指针:sizeof(g) = 8 byte
四、结构体的sizeof
1、考虑内存对齐
内存对齐原则:
(1)结构体变量的首地址能够被其最宽基本成员类型大小所整除;
(2)结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
(3)结构体的总大小为结构体最宽基本成员类型大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)。
(4)空结构体(不含数据成员)的sizeof值为 1。
struct A {
char a; //0
int b;
long c;
double d;
char ch[5];
};
//sizeof(A) = 32 byte
/*
根据对齐原则:
1、结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,即是4的倍数
2、起始位置要从该成员的子成员大小的整数倍开始
即a占 1 byte,处于位置0 ,但b从位置4开始,为 5-8 byte
同理:c为9-12 byte ,d 为 13-20byte
故如果不要char ch[5] sizeof(A) = 24 byte (8byte的整数倍)
算上ch,ch为25-29byte,最后sizeof(A) = 32 byte
*/
struct B {
A a1;
int *p;
void(*f)();
};
//sizeof(B) = 32 + 8 + 8 = 48 byte