內(nèi)存篇(一):內(nèi)置類型的機(jī)器實(shí)現(xiàn)和sizeof
一、內(nèi)置類型的機(jī)器實(shí)現(xiàn)
C++內(nèi)置類型及尺寸:
類型 | 含義 | 最小尺寸 |
---|---|---|
bool | 布爾類型 | 未定義 |
char | 字符 | 8位 |
wchar_t | 寬字符 | 16位 |
char16_t | Unicode字符 | 16位 |
char32_t | Unicode字符 | 32位 |
short | 短整型 | 16位 |
int | 整型 | 16位 |
long | 長整型 | 32位 |
long long | 長整型 | 32位 |
float | 單精度浮點(diǎn)數(shù) | 6位有效數(shù)字 |
double | 雙精度浮點(diǎn)數(shù) | 10位有效數(shù)字 |
long double | 擴(kuò)展精度浮點(diǎn)數(shù) | 10位有效數(shù)字 |
- 字節(jié)(byte):計(jì)算機(jī)里可尋址的最小內(nèi)存塊凄杯,一般為8位
- 字(word):計(jì)算機(jī)里存儲的基本單元靠欢,一般為32位或64位炒俱。
-
計(jì)算機(jī)將每個字節(jié)和一個地址關(guān)聯(lián)起來蛛蒙,可以看到相鄰字節(jié)存放的地址相差1:
? 要給一個對象分配內(nèi)存帚屉,是必須指明其類型的,因?yàn)槠漕愋椭该髁藬?shù)據(jù)所占的比特?cái)?shù)以及機(jī)器要如何解釋這些內(nèi)容慕趴,機(jī)器可以以此為依據(jù)以對象的內(nèi)存地址作為起始地址往下讀入相應(yīng)大小的比特?cái)?shù)并且依據(jù)類型進(jìn)行解釋痪蝇。
以下是《C++ Primer》里推薦的一些選用類型準(zhǔn)則:
- 當(dāng)明確知道數(shù)值不可能為負(fù)時,選用無符號類型
- 使用int執(zhí)行整數(shù)運(yùn)算冕房。實(shí)際應(yīng)用中short常常太小而long有和int一樣的尺寸躏啰。如果數(shù)值超過int的范圍就使用long long。
- 浮點(diǎn)數(shù)選double耙册,因?yàn)閒loat精度經(jīng)常不夠给僵,long double的精度一般沒有必要且運(yùn)行消耗大。
二详拙、sizeof運(yùn)算符
? sizeof
運(yùn)算符返回一個表達(dá)式或者一個類型所占的字節(jié)數(shù)帝际,下面來看一下它的用法。
sizeof(double); //返回8溪厘,,意思是8個字節(jié)胡本,即double類型的對象所占空間的大小
double A;
sizeof A; //返回8,A的類型double的對象所占空間的大小
double* p;
sizeof p; //返回4畸悬,指針p所占的空間大小
sizeof *p; //返回8侧甫,p指向的類型double所占空間大小
-
sizeof
滿足右結(jié)合律(即一個表達(dá)式中存在優(yōu)先級相同的運(yùn)算符時珊佣,右側(cè)運(yùn)算符優(yōu)先與操作數(shù)結(jié)合),且與*運(yùn)算符優(yōu)先級一樣披粟,所以表達(dá)式sizeof *p
的組合順序是從右往左咒锻,等價于sizeof( *p)
。 - 注意
sizeof
對于數(shù)組和指針操作的數(shù)組的區(qū)別:
double p[10];
sizeof(p); //返回8*10守屉,是整個數(shù)組的大小
double *p1 = new double[10];
sizeof(p1)惑艇;//返回4,是一個指針的大小
? 盡管p和p1都是一個數(shù)組第一個元素的地址拇泛,sizeof
返回的內(nèi)容卻并不一樣滨巴,前者返回?cái)?shù)組對象類型占用字節(jié)數(shù)*數(shù)組的元素個數(shù),而后者返回的是一個指針占用的字節(jié)數(shù)俺叭。