首页 > 学院 > 开发设计 > 正文

sizeof鲜为人知的秘密

2019-11-08 03:14:55
字体:
来源:转载
供稿:网友

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);//error

这里写图片描述

2.字符串的sizeof比strlen大1.因为sizeof计算的是变量才内存中占用的字节数,而字符串中的/0字符也是要占用1个字节的;但是strlen函数计算的是字符串的实际长度,直到遇到/0.

char s[] = "this is a test";cout << sizeof(s) << endl;//15cout << strlen(s) << endl;//14

这里写图片描述

3.sizeof计算时不涉及对内存空间的访问,仅仅提取算子的数据类型。

string a = "test";cout << sizeof(a.at(1 << 100000)) << endl;

这里写图片描述

假设sizeof访问了内存,由于1 << 100000超出了a的范围,at函数理应抛出out_of_range异常,但现在程序完美运行,故假设不成立.


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表