sizeof计算的是在栈中分配的内存大小
1、sizeof不计算static变量占得内存
2、指针的大小一定是4个字节,不管是什么类型的指针
3、各类型大小
char型:1个字节
int 型:4个字节
short int 型:2个字节
long int 型:4个字节
float 型:4个字节
double 型:8个字节
string 型:4个字节
空类:1个字节
class A
{
A();
~A();
};//空类大小为1
单一继承的空类:1个字节
虚继承(涉及到虚指针):4个字节
4、数组长度:
指定了数组长度,不看元素个数,总字节数=数组长度*sizeof(元素类型)
未指定数组长度,按实际元素个数类确定(若是字符数组,末尾空字符)
int x[10];int *p=x;
sizeof(x):数组中所有元素所占空间大小 10*4=40
sizeof(*x):数组x第一个元素所占空间大小 4
sizeof(p):p指针本身所占空间大小 4
sizeof(*p):p所指对象的大小,也即是数组x第一个元素的大小 4
sizeof(x)/sizeof(*x) :x的元素个数 10
sizeof(p)/sizeof(*p):1 sizeof(p)算出指针p的大小,而非指向的数组大小,指针实际上违背是实际使用
5、结构体对象的长度:
内存对齐问题:第一个成员在与结构体变量偏移量为0的地址处;
其他成员变量对齐到整数倍地址,对齐数VS 8,linux 4;
结构体的总大小为最大对齐数的整数倍;
若嵌套结构体,对齐内部成员最大的对齐数。
不同顺序会影响结构体大小
struct stu1
{
int i; //4 偏移量0 0能被4整除,=4
char c; //1 偏移量4 1能被4整除,=1+4=5
int j; //4 偏移量为5 5不能被4整除,补3个字节=8能被4整除,8+4=12
}; //大小:12
struct stu2
{
int k; //4 偏移量0 0能被4整除,=4
short t; //2 偏移量4 4+2=6,不能被最大类型int=4整除,补2个字节6+2=8
}; //大小:8
struct stu3
{
char c1; //1 偏移量0 大小1 0能被1整除,=1
int i; //4 偏移量1 大小为4 1能被4整除 =1+3+4=8
char c2; //1 偏移量8 大小为1 8能被1整除 =8+1=9 9不能被最宽4整除 9+3=12
}; //大小:12
struct stu4
{
char c1; //1 偏移量0 大小1 0能被1整除,=1
char c2; //1 偏移量1 大小1 1能被1整除,=1+1=2
int i; //4 偏移量2 大小4 2不能被4整除 =2+2+4=8
}//大小:8
struct stu5
{
float f; //4 偏移量0 0能被4整除,=4
char p; //1 偏移量4 4能被1整除,=4+1=5
int adf[3]; //3*4=12 偏移量5 5不能被4整除,=5+3=8偏移量为8 8+12=20
}//大小:20
class A
{
char c1; //1 0 =1
int i; //4 1 1/4不能 偏移量1+3=4 =4+4=8
short s; //2 8 8/2可以 =8+2=10
char c2; //1 10 10/1可以 =10+1=11
char a[];//未指定大小的数组且未填充值,不占用内存
};//大小11不能被4整除,=12