这三个函数(运算符)在进行容器或数组操作过程中经常用到。由于用法有相似之处,因此经常混淆。在此对它们的用法进行总结。
1.sizeof()
sizeof()用于返回括号中的对象在内存中分配的大小,如:
sizeof(char)=1; //char型分配一个字节大小的内存
sizeof(int)=4; //int型分配四个字节大小的内存(因编译系统而异,32位系统下是4,64位系统下是8)
sizeof(double)=8; //double型分配八个字节大小的内存
要注意的是,括号中的对象不仅仅可以是标准数据类型,也可以是数组、结构体、类对象、指针等,如下:
int *p=new int[8];
int t=sizeof(p); //此时t的值为4。对于32位系统,由于地址占四个字节,故所有指针的sizeof()的结果均是4;对于64位系统,结果则变成8。以下均默认为32位系统
****************************************************************************
char *p[]={"Chinese","Maths","English","Science"};
int t=sizeof(p); //这里的p是一个指针数组,数组大小为4。诚如上述,单个指针所占字节数为4,故t=4*4=16;
****************************************************************************
struct test{
int x,y;
char c;
};
int t=sizeof(test); //经过试验,输出的结果是12,这与之前的预想不太一致(4*2+1=9)。在博文http://www.cnblogs.com/0201zcr/p/4789332.html中有详细解释。简而言之,即编译器需保证每个成员的偏移量是每个成员大小的整数倍以及结构体的整体大小是所有成员大小的整数倍。因此,成员书写的顺序不同,结构体的所占内存的大小也会不同。
****************************************************************************
对于类对象的sizeof()的值,相对更加复杂,在博文http://blog.csdn.net/vangoals/article/details/4264512中有详细说明,此处不再赘述。
2.size()与length()
size()函数是用于计算string对象长度的一个成员函数,它包含在STL中,如下所示:
string s="I love you";
int t=s.size(); //t的值为10
用起来非常的简洁明了。而length()的效果和它是完全一致的,不过它使用的历史更早。
3.多说几句
综合1与2,那么sizeof(string)的大小是多少呢?实验是检验真理的唯一标准。我在Visual Studio 2012上测试如下:
string s="Chinese",t="Maths";
cout<<sizeof(s)<<" "<<sizeof(t)<<" "<<sizeof(string)<<endl;
最后输出的结果显示三个值均为28!考虑到一个字符的大小为1个字节,如果string的长度超过28,那么结果会是多少呢?为此进行了如下测试:
string p="to be or not to be, it is a question.";
cout<<sizeof(p)<<endl;
最后输出的结果仍然是28!查阅了相关资料得到结论:尽管不同的库对string的实现方式不同,但相同的一点是,无论放多长的字符串,它的sizeof()的结果都是固定。具体的值因不同的库而异,也与编译器有关。