1 sizeof 是运算符,不是函数
2 sizeof 不能求得void
类型的长度,能求得 void*
类型的指针的长度
sizeof(void) 会导致编译错误。因为声明一个变量的最重要的作用就是告诉编译器该变量需要多少的存储空间,然而void是空类型,编译器无法确定void类型所需要的存储空间。
声明void*
在32位的机子上面是 4 字节的空间, 在64位的机子上面是 8 字节的空间。
3 sizeof 对结构体的大小的求解并不等于各个数据成员的大小的和
struct A{
int a;
int b;
double c;
};
struct B{
int a;
double b;
int c;
};
sizeof(A) //16
sizeof(B) //24
- 1 结构体的大小等于结构体内最大成员的大小的整数倍
- 2 结构体内的成员的首地址相对于结构体首地址的偏移量是其类型大小的整数倍,比如说
double
型成员相对于结构体的首地址的地址偏移量应该是8的整数倍 - 3 为了满足上面两条的规则,编译器会在结构体成员之后进行字节填充
再来看sizeof(B)
,第一个成员a
的首地址是0,他的类型是int
,因此他的占用地址是0--3,第二个成员是double
,他占用8个字节,由于之前a之占用了4个字节,为了满足规则2,是的b的起始地址偏移量是8,占用的地址空间是8--15,第三个数据成员是int
类型,占用4个字节,由于a和b共占用16个字节,而c占用16--19字节,那是不是结构体的大小就是20个字节呢,
错误,规则1的有沿途结构体内的最大数据成员是
double
类型,因此还要在c的后面填充4个字节,是的结构体的大小是24个
4 sizeof 可以对函数调用求大小,记住求得大小是返回类型的大小,而且不执行函数体
int fun(int &a, int &b)
{
float c = 2.0;
double d = 0.5;
a = a+b;
return d;
}
int a =3;
int b =5;
cout << sizeof(fun(a,b))<<endl; //4
cout << a <<endl; //3
fun()的返回类型是int
类型的,许多人认为返回是 double
型的 ret, 但是进行了不安全的类型转换 double ---> int
a 的值,sizeof根本就不执行函数体