昨天去Virtuos做笔试,虽然做了很多的准备,但是感觉还是不尽如人意。其中,关于sizeof的操作,让我觉得有些恼火。回来后,又在网上找了下相关的帖子,总算有了点系统的了解。
sizeof主要用于两个方面的运算:
Part 1.用于数据类型
格式为
sizeof(type)
此处,必须用括号。
Part 2.用于变量
格式为
sizeof(var_name) 或者 sizeof var_name
此处,括号可用可不用,不过一般来说,程序员都习惯加括号。(我也喜欢加括号^_^)。
在使用sizeof时,有以下一些地方需要注意:
1、在使用sizeof对结构体进行运算时,要考虑到位对齐,而不是单纯的将结构体中的变量进行相加处理。如:
Struct MyStruct { double a; int b; char c; }
在上面代码中,对MyStruct进行sizeof()运算,结果为16,而不是8+4+1 = 13。
2、函数的形参均为指针,故,在对形参进行sizeof()运算时,得到的是指针大小。依编译器和平台不同而不同,在vc中一般为4。如:
int func(char s[4])
{
cout << sizeof(s) << endls;//函数的参数为指针,所以求的是指针大小
}
sizeof("1234") = 4 //因为func返回的是int,所以sizeof("1234") = sizeof(int)
3、对类进行sizeof()运算。
一般对类进行sizeof()运算,和情况1相同。需要注意的是:
a、空类为的sizeof()运算为1。
b、类中的函数和Static成员变量均不计算在内。因为它们都属于stack allocation。
c、类中有虚函数的话,应该在计算成员sizeof()之和后,再加上sizeof(v表)。在VC中,sizeof(V表) = 4。
其他的就不清楚了~
4、参数为数组或指针。
此类情况,数组会返回数组所占空间,指针则是直接返回值。如:
int a[50]; //sizeof(a)=4*50=200; 求数组所占的空间大小 int *a=new int[50];// sizeof(a)=4; a为一个指针,sizeof(a)是求指针的大小,在32位系统中,当然是占4个字节。