引言:先看下面一个程序会打印出什么?
1 #include<iostream> 2 using namespace std; 3 int main() 4 { 5 int a = 2; int *p = &a; 6 double b = 1; double *q = &b; 7 float c = 3; float *l = &c; 8 char d = 's'; char *s = &d; 9 10 11 cout << sizeof(a) << "" <<sizeof(p) << endl; 12 cout << sizeof(b) << "" << sizeof(q) << endl; 13 cout << sizeof(c) << "" << sizeof(l) << endl; 14 cout << sizeof(d) << "" << sizeof(s) << endl; 15 return 0; 16 }
64 位Linux 下测试结果:
1 4 8 2 8 8 3 4 8 4 1 8
64 位Windows下测试结果:
1 4 4 2 8 4 3 4 4 4 1 4 5
好奇的人可以自己去测试结果,这里留点悬念!我只告诉你不同的电脑、不同的编译器都有可能得出不一样的结果。为什么呢?请往下看:
首先:
1. 操作系统有32/64位之分,但同时CPU也有32/64位之分(Windows 在cmd终端下用 systeminfo 命令可以查看自己的操作系统以及cpu位数);
2. 32位CPU只能安装32位系统,64位CPU可以安装32位操作系统,也可以安装64位操作系统;
3. 一般来说,在64位系统下,指针长度为8,32位系统下,指针长度位4;但是有的编译器为了不同的操作系统之间相互兼容,内部对指针进行了包装,使得不管在64位还是32位系统下,指针都是4个字节长度。
4. 64位系统,这个位数指的是CPU里面的通用寄存器的数据宽度为64位,也就是说一个地址占二进制位数是64,而指针其实是一个地址,所以:
1 sizeof(double *)==sizeof(int *)==sizeof(char *)==64/8==8
这里除以8是因为,我们用sizeof()计算的是某个数据类型所占的字节个数,用此字节个数来表示这个数据类型的大小 ,而我们都知道,一个字节所占的二进制位为8位,因此才除以8.
5. 32位系统,同理,一个地址占32位二进制空间,sizeof(double *)==sizeof(int *)==sizeof(char *)==32/8==4
注意:地址艮系统的位数有关,但是基本的数据类型所占字节数(大小)是由C语言本身决定的,如:int 就只占4个字节,char 就只占一个字节,与系统无关。