引言:先看下面一個程序會打印出什么?
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 就只占一個字節,與系統無關。