只要參加軟件研發的筆試(C/C++)幾乎都會涉及到sizeof()的用法,我昨天也遇到了,有的也會,可是真正sizeof()的核心仍是沒有領會,今天上網,無聊中就看到了詳細的sizeof()的闡述,如今分享給你們。
------------
sizeof----------------
sizeof 通常形式爲:sizeof(object),也能夠sizeof var_char,不過大部分programer習慣用sizeof()。
對象能夠是表達式或者數據類型名,當對象是表達式時,括號可省略。sizeof是單目運算符,其運算符的含義是:求出對象在計算機內存中所佔用的字節數。通常來說,不一樣的機器,運行不一樣的對象是不同的,當目前幾乎全部的機器都是32位,不多16位的,因此通常考試都是基於32位的window和linux的。
C語言中數據類型很少。
1.整數型的:
short,int,long(我沒有考慮符號問題),通常c語言書上講,int是2個字節的,即16位,範圍是-32768-32767,long是4個字節,範圍是-2^32---2^32-1。當時在xp上運行sizeof(int)的時候,會output 4.這就是32位的緣由。sizeof(long)也是4.
以下:#include "stdio.h"
#include "string.h"
#include "stdlib.h"
int main()
{
short int sa=10;
int a=10;
long la=10;
float f = 20;
double d=20;
char ch='c';
char str[]="ABC";
char *p=str;
struct str{
double d;
char ch;
int data;
}str_wu;
struct str1{
char ch;
double d;
int data;
}str_wu1;
printf("sizeof(short):%d\n",sizeof(sa));
printf("sizeof(int):%d\n",sizeof(a));
printf("sizeof(long):%d\n",sizeof(la));
printf("sizeof(float):%d\n",sizeof(f));
printf("sizeof(double):%d\n",sizeof(d));
printf("sizeof(char):%d\n",sizeof(ch));
printf("sizeof(string):%d\n",sizeof(str));
printf("sizeof(point address):%d\n",sizeof(p));
printf("sizeof(Point):%d\n",sizeof(*p));
printf("sizeof(Struct):%d\n",sizeof(str_wu));
printf("sizeof(Struct):%d\n",sizeof(str_wu1));
system("pause");
}
於是int,short的sizeof結果是同樣的額。
2.浮點型數據
float,double,long double
上邊的圖,long double 沒有測試(忘了。。。。。)呵呵!
可是應該是16。
3。指針
對於指針,要特別區分,指針指向什麼數據,它在內存佔的字節數纔是它的結果。
好比:指針指向一個字符串,就是字符串的長度,由於一個字符在內存中佔一個字節。若指針指向一個數據結構,則結果應該是結構型數據的內存字節數。
4。結構類型
在上面的程序中,
struct str{
double d;
char ch;
int data;
}str_wu;
struct str1{
char ch;
double d;
int data;
}str_wu1;
兩個不一樣的結構,可是內部的元素是相同的,都是double,int,char,只是順序不同,就結果不同。why?
這時由於VC存儲數據的時候要對其,具體的狀況以下:
類型
對齊方式(變量存放的起始地址相對於結構的起始地址的偏移量)
Char
偏移量必須爲sizeof(char)即1的倍數
int
偏移量必須爲sizeof(int)即4的倍數
float
偏移量必須爲sizeof(float)即4的倍數
double
偏移量必須爲sizeof(double)即8的倍數
Short
偏移量必須爲sizeof(short)即2的倍數
好比:str_wu,爲上面的結構分配空間的時候,VC根據成員變量出現的順序和對齊方式,先爲第一個成員dda1分配空間,其起始地址跟結構的起始地址相同(恰好偏移量0恰好爲sizeof(double)的倍數),該成員變量佔用sizeof(double)=8個字節;接下來爲第二個成員dda分配空間,這時下一個能夠分配的地址對於結構的起始地址的偏移量爲8,是sizeof(char)的倍數,因此把dda存放在偏移量爲8的地方知足對齊方式,該成員變量佔用sizeof(char)=1個字節;接下來爲第三個成員type分配空間,這時下一個能夠分配的地址對於結構的起始地址的偏移量爲9,不是sizeof(int)=4的倍數,爲了知足對齊方式對偏移量的約束問題,VC自動填充3個字節(這三個字節沒有放什麼東西),這時下一個能夠分配的地址對於結構的起始地址的偏移量爲12,恰好是sizeof(int)=4的倍數,因此把type存放在偏移量爲12的地方,該成員變量佔用sizeof(int)=4個字節;這時整個結構的成員變量已經都分配了空間,總的佔用的空間大小爲:8+1+3+4=16,恰好爲結構的字節邊界數(即結構中佔用最大空間的類型所佔用的字節數sizeof(double)=8)的倍數,因此沒有空缺的字節須要填充。因此整個結構的大小爲:sizeof(str_wu)=8+1+3+4=16,其中有3個字節是VC自動填充的,沒有聽任何有意義的東西。
而str_wu1,一樣的道理:以下:sizeof(char)=1,而1不是8的倍數,於是增長到8,sizeof(double)=8,如今開始地址是16,16是sizeof(int)的倍數,能夠存入。
於是總的地址數:sizeof(char)+7+sizeof(double)+sizeof(int)=20,
而20不是8的倍數(sizeof(double)=8),因此須要在增長4個地址,即總共24。
----------------------
sizeof具體的,我所知道的就這些了,那位高手還知道什麼,或者我寫的有什麼錯,但願指出。謝謝!