sizeof可以对函数调用求值,结果为函数返回值类型的大小,函数并不会被调用,因为sizeof只是提取算子的数据类型,并不会执行算子。
我们来看一个完整的例子:
char foo(){ PRintf("foo()has been called./n"); return 'a';}int main(){ size_t sz = sizeof(foo()); //foo()的返回值类型为char,所以sz=sizeof(char),foo()并不会被调用 printf("sizeof(foo())=%d/n",sz); return 0;}特别地,如果函数返回值为void,则sizeof的值为sizeof(void)== 1,注意不是0;
ISO C++标准规定,函数、以及位域(bit-field)成员不能被计算sizeof值,即下面这些写法都是错误的:
int foo2(){}sizeof(foo2);//errorstruct S{unsigned int f1:1;unsigned int f2:5;unsigned int f3:12;};sizeof(S::f1);//error2.字符串的sizeof比strlen大1.因为sizeof计算的是变量才内存中占用的字节数,而字符串中的/0字符也是要占用1个字节的;但是strlen函数计算的是字符串的实际长度,直到遇到/0.
char s[] = "this is a test";cout << sizeof(s) << endl;//15cout << strlen(s) << endl;//143.sizeof计算时不涉及对内存空间的访问,仅仅提取算子的数据类型。
string a = "test";cout << sizeof(a.at(1 << 100000)) << endl;假设sizeof访问了内存,由于1 << 100000超出了a的范围,at函数理应抛出out_of_range异常,但现在程序完美运行,故假设不成立.
新闻热点
疑难解答