星期四, 三月 02, 2006
谈一下sizeof
最近在论坛里总看到有人问关于sizeof的问题,并且本人对这个问题也一直没有很好的考虑过,索性今天来个了断,也结合strlen进行比较,如果能对网友有一点点帮助,也算是有点功劳吧,
好首先看看sizeof和strlen在MSDN上的定义:来看MSDN上如何对sizeof进行定义的:
sizeof Operator
sizeof expression
The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type
(including aggregate types). This keyword returns a value of type size_t.
The expression is either an identifier or a type-cast expression (a type specifier enclosed in
parentheses).
When applied to a structure type or variable, sizeof returns the actual size, which may include
padding bytes inserted for alignment. When applied to a statically dimensioned array, sizeof
returns the size of the entire array. The sizeof operator cannot return the size of dynamically
allocated arrays or external arrays.
然后再看一下对strlen是如何定义的:
strlen
Get the length of a string.
Routine Required Header:
strlen <string.h>
size_t strlen( const char *string );
Parameter
string:Null-terminated string
Libraries
All versions of the C run-time libraries.
Return Value
Each of these functions returns the number of characters in string, excluding the terminal
NULL. No return value is reserved to indicate an error.
Remarks
Each of these functions returns the number of characters in string, not including the
terminating null character. wcslen is a wide-character version of strlen; the argument of
wcslen is a wide-character string. wcslen and strlen behave identically otherwise.
首先看,我用红笔标出来的两句话,第一句是指sizeof 求出来的长度是所有的长度,也就是说包含字符串的结束符,而第二句则说明了strlen求出来的字符串长度是不包含字符末尾的结束符的。而且要注意,sizeof是运算符,strlen是函数。
由几个例子说开去。第一个例子:假设内存中是32位
char* ss = "0123456789"; ss是指针
sizeof(ss) 结果是4,ss是指针,所以是4个字节
sizeof(*ss) 结果是1,指的是第一个字节
char ss[] = "0123456789";
sizeof(ss) 结果是11,因为char ss[]也是声明一个字符串,所以求得还是字符串ss的长度,况且结束符也算在内。
sizeof(*ss) 结果为1同上
char ss[100] = "0123456789";
sizeof(ss) 结果100 同上但结束符在数组内,包括空字节
strlen(ss) 结果为10 strlen是个函数内部实现是用一个循环计算到为止之前
int ss[100] = "0123456789";
sizeof(ss) 结果为400,每个int类型占用4个字节
strlen(ss) 出错,strlen函数只能求字符串,原形为extern int strlen(char *s);
char q[]="abc";
char p[]="an";
sizeof(q),sizeof(p),strlen(q),strlen(p);
结果是 4,3,3,2
再看一个例子 sizeof()用类作参数
X{
int i;
int j;
char k;
};
X x;
cout<<sizeof(X)<<endl; 结果 12 内存补齐
cout<<sizeof(x)<<endl; 结果 12 同上
总结一下就是sizeof是算符,strlen是函数。
sizeof可以用类做参数,如上例,输出是所占内存空间的总合,strlen只能用char*做参数,且必须是以''''结尾的。sizeof还可以用函数做参数,比如: short f();
printf("%dn", sizeof(f()));
输出的结果是sizeof(short),即2。
数组做sizeof的参数不退化,传递给strlen就退化为指针了
虽然还有好多,但就一般程序员来说,这也足够了吧,只有大师才去想的那么深
谈一下java中的问题
java比c++更灵活,使用sizeof()这个函数的时候谁都会觉得很方便,但使用完了以后,没有谁会每次都记得释放内存,一段小程序也许无所谓,但应用到大项目中去就很所谓了,c++程序员要考虑得更多!java思想也已经很完美了,自动释放垃圾内存,况且java的基本数据类型在机器中都是等长的,这也是java跨平台的原因啊,呵呵,现在java这么流行,也是因为做web做网络有其不可抗拒的优势啊
好了,先讨论到这里吧,在公司呆得太晚了,该回去了



