今天准备写读书笔记blog的时候,偶然看到CSDNblog首页的一篇关于sizeof的文章,帮我解决了关于sizeof的许多疑难杂症。
贴出来分享给大家:
http://blog.csdn.net/scythe666/article/details/47012347
原文就不复制了,大家点击看吧,尊重原作者。
记得某次朋友去面腾讯的C++岗实习,面试官也问了他sizeof的问题,他是C++大神,回答之前就和考官确认“老师您的机器是32位还是64位的”,他说考官当时就笑了,估计这个考官就是埋伏的这个点吧。
然后我就回家试了下sizeof的东西,但是还是很不系统的了解,今天看了这篇文章后,我在网上查看了很多siezeof的相关内容,系统地解决了自己关于sizeof这个疑难杂症,整理一下当作自己的学习笔记吧。
1,基本类型的sizeof()值
首先,绝大多数的我们普通学生,基本都是win32机,使用vc,所以对于我们普通人来说,在这种环境下,各类型的sizeof如下:
C类型 | 32位 | 64位 |
---|---|---|
char | 1 | 1 |
int | 4 | 4 |
float | 4 | 4 |
double | 8 | 8 |
short int | 2 | 2 |
long int | 4 | 8 |
long long int | 8 | 8 |
char* | 4 | 8 |
需要说明一下的是所有指针类型存储的是所指向变量的地址,所以32位机器只需要32bit,而64位机器需要64bit。
Code:
#include <iostream>
using namespace std;
int main()
{
cout<<"sizeof(int)=="<<sizeof(int)<<endl;
cout<<"sizeof(float)=="<<sizeof(float)<<endl;
cout<<"sizeof(double)=="<<sizeof(double)<<endl;
cout<<"sizeof(char)=="<<sizeof(char)<<endl;
cout<<"sizeof(short int)=="<<sizeof(short int)<<endl;
cout<<"sizeof(long int)=="<<sizeof(long int)<<endl;
char p1[] = { 'a', 'b', 'c', 'a', 'b', 'c' };
char p2[] = "abcdef";
cout<<sizeof(p1)<<endl;
cout<<sizeof(p2)<<endl;
return 0;
}
Output:
sizeof(int)==4
sizeof(float)==4
sizeof(double)==8
sizeof(char)==1
sizeof(short int)==2
sizeof(long int)==4
6
7
这里解释下char数组两种实例化方法的不同,第一种是没有’\0’的,我专门写出来加深下印象,另外p1、p2是数组的sizeof,这里不是指针变量,数组的sizeof值是数组长度*元素类型sizeof值。
2,不同环境下int变量的sizeof()
int占多少个字节是由编译器决定的。
ansi标准定义int是占2个字节.
tc是按ansi标准的,它的int是占2个字节的.
不同的编译器,规定也不一样。float,double也是一样的,在不同的编译器里,占的字节是不一样的。
3,为什么int是4个字节
说int和void*一样长只是因为在一般情况下它们都应该可以放到单个寄存器里,其实这样说很不确切,还是不要这样理解的好:说在xx位的cpu上int是多少位只是因为这级别的cpu有对xx位数据进行操作的单条指令(因为寄存器是xx位)(可能会有扩展指令,我不清楚,但关键看寄存器的位数),从而编译器就图个方便把int做为xx位;这也不一定的,譬如以后64位机器出来了,可能编译器只是把long扩到64位,而int还是当作32,也挺合适的。
int是最基本的类型,一般和CPU的字宽一致。
《C++ primer》中的描述:“一般地,short类型为半个机器字(word)长,int类型为一个机器字长,而long类型为一个或两个机器字长(在32位机器中,int类型和long类型通常字长是相同的)。”其实这是个历史遗留问题,16位时期long就是32位的,为了兼容。而int应该是最适合当前机器的字长,所以也是32位的。
参考资料:
http://bbs.csdn.net/topics/390539467
http://www.cnblogs.com/hnrainll/archive/2011/07/06/2098999.html