分析案例
在网上看到一个关于sizeof疑问的文章,所以就想认真研究下,例子代码如下:
#include<iostream>
using namespace std;
int main(void)
{cout << sizeof("123456789") << endl; //10cout << sizeof("123456789" + 1) << endl; //4(32位)、8(64位)cout << strlen("123456789") << endl; //9cout << strlen("123456789" + 1) << endl; //8int i = 10;cout << i << endl; //10cout << sizeof(++i) << endl; //4cout << i << endl; //10return 0;
}
运行结果如下(32位):
sizeof是一个运算符,主要功能就是求解变量或者类型(如int、结构体、类)的所占内存大小。现在一行一行分析:
a.第一个输出
cout << sizeof("123456789") << endl; //10
"123456789"是一个常量字符串,存放在常量区(全局区/静态区里面),因为是一个字符串所以后面还有一个’\0’,因此所占内存大小是10。
b.第二个输出
cout << sizeof("123456789" + 1) << endl; //4(32位)、8(64位)
可以看出这个返回的是一个指针大小,我们可以使用typeid关键字来判断:
cout << sizeof("123456789") << endl; //10
cout << typeid("123456789").name() << endl; //char const [10]
cout << sizeof("123456789" + 1) << endl; //4(32位)、8(64位)
cout << typeid("123456789" + 1).name() << endl; //char const *
字符串常量是一个char const [10]类型,而+1后就从数组退化为指针类型char const *,而sizeof对于指针返回指针大小,作用于数组名返回整个数组的所占内存大小。
c.第三个输出
cout << strlen("123456789") << endl; //9
strlen是一个函数,返回字符串长度(不是所占内存大小),遇到’\0’结束,这个字符不计算在内。因此只有9个字符,返回9。
d.第四个输出
cout << strlen("123456789" + 1) << endl; //8
从前面第二行分析可知,返回的是一个char const *指针,它指向’2’这个字符,因为+1就是指针后移一位,可以验证:
e.后面三个输出
int i = 10;
cout << i << endl; //10
cout << sizeof(++i) << endl; //4
cout << i << endl; //10
可以发现++i并没有执行,因此sizeof另一个特性:编译器不计算表达式,就知道数据类型。因此sizeof括号里的表达式不会被执行。
总结
- 它是一个运算符,在编译时由编译器计算(常量),不是一个函数
#include<iostream>
using namespace std;
int main(void)
{cout << sizeof(int) << endl;cout << sizeof(4) << endl;return 0;
}
反汇编代码如下:
可以看出在这两行代码在转为汇编代码时是一样的,因此可以判断出在编译时sizeof(int)被编译器替换为4。
- sizeof括号里的表达式不会被执行,编译器会计算括号中的数据类型
- sizeof对于数组名和指针返回结果不一样