sizeof詳解

轉(zhuǎn)載自:http://blog.csdn.net/wxwtj/article/details/6636220

sizeof簡(jiǎn)介:是一個(gè)算符,大部分編譯程序在編譯的時(shí)候(最新標(biāo)準(zhǔn)是在運(yùn)行時(shí)也可以計(jì)算了)就把sizeof計(jì)算過(guò)了,計(jì)算的是棧中(注意只計(jì)算棧上的)類型或者變量的類型的長(zhǎng)度(其實(shí)是編譯器分配的內(nèi)存大小,所以與編譯器有關(guān))。
而strlen是一個(gè)函數(shù),在運(yùn)行的時(shí)候計(jì)算的,只能計(jì)算字符串的長(zhǎng)度,參數(shù)只能是char*,且必須以”\0”結(jié)尾。
本人比較懶,喜歡記結(jié)論:

1.基本類型的大?。J(rèn)32位系統(tǒng))

bool:1 char:1 short:2 float:4 int:4 long:4 double:8
int a[100]={1,2} ;對(duì)這句,不要認(rèn)為a是地址,所以sizeof(a)=4!答案是40,因?yàn)槟隳菢訉懀幾g器就給數(shù)組a留了40個(gè)字節(jié)的空間

2.指針:

指針就是一個(gè)指向另一個(gè)對(duì)象的地址,32位系統(tǒng)的地址總線32根,所以為4個(gè)字節(jié)。
針對(duì)指針再多說(shuō)兩句,只要你確定X是指針,sizeof(X)就=4;這種題需要注意的是你一下沒(méi)看出來(lái)是指針的情況,如:
Char var[10]
int test (char var[])
{
Return sizeof(var)
}
答案為4,因?yàn)閿?shù)組作為參數(shù)傳給函數(shù)時(shí)傳的是指針(數(shù)組的首地址)var[]等價(jià)于*var,已經(jīng)退化成一個(gè)指針了。呵呵,熟悉MFC消息結(jié)構(gòu)的朋友應(yīng)該很清楚:MFC消息處理函數(shù)使用兩個(gè)參數(shù)WPARAM、LPARAM就能傳遞各種復(fù)雜的消息結(jié)構(gòu)(使用指向結(jié)構(gòu)體的指針)。

3.編譯階段替換:

sizeof()中()內(nèi)的內(nèi)容在編譯過(guò)程中是不會(huì)被編譯的,而是被替代類型。
如int a;sizeof(a)在編譯過(guò)程中不論a等于多少都會(huì)被替換成sizeof(int); sizeof(a=8)執(zhí)行之后,a會(huì)等于6么?答案是否定的,才說(shuō)了是不會(huì)被編譯的,如果sizeof()括號(hào)里面是個(gè)表達(dá)式,編譯器根據(jù)表達(dá)式的最終結(jié)果類型來(lái)確定大小,不會(huì)對(duì)表達(dá)式進(jìn)行計(jì)算
如果是函數(shù)的話,在編譯階段會(huì)被函數(shù)韓返回值取代,不會(huì)執(zhí)行函數(shù),如:int f1{return 0;} sizeof(f1)會(huì)被替換成sizeof(int);

4.結(jié)構(gòu)體

為了性能考慮,編譯器會(huì)對(duì)結(jié)構(gòu)體進(jìn)行對(duì)齊。具體原因參看百度百科http://baike.baidu.com/view/4786260.htm
VC規(guī)定:

  1. 各成員變量存放的起始地址相對(duì)于結(jié)構(gòu)的起始地址的偏移量必須為該變量的類型所占用的字節(jié)數(shù)的倍數(shù)。
  2. 為了確保結(jié)構(gòu)的大小為結(jié)構(gòu)的字節(jié)邊界數(shù)(即:該結(jié)構(gòu)中占用最大空間的類型所占用的字節(jié)數(shù))的倍數(shù),所以在為了最后一個(gè)成員變量申請(qǐng)空間后,還會(huì)根據(jù)需要自動(dòng)填充空缺的字節(jié)。

舉3個(gè)例子:例1:

#include "stdafx.h"
#include"iostream"
using  namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
    struct
    {   int b;//4
        double a;//8
        char c;//1
    }A;
    cout<<sizeof(A);
 return 0;
}

輸出為24,因?yàn)閟izeof(b)等于4,而到sizeof(a)=8時(shí)根據(jù)規(guī)定1,a相對(duì)于結(jié)構(gòu)體的地址偏移量要為8的整數(shù)倍,所以補(bǔ)齊4個(gè)字節(jié),到c時(shí),sizeof(c)=1,但是此時(shí)結(jié)構(gòu)體大小為17,不是8的整數(shù)倍,所以還要補(bǔ)齊7個(gè)字節(jié),所以等于24.內(nèi)存布局如下:
|<<<b=4>>>|補(bǔ)齊4個(gè)字節(jié)|<<<<<<<a=8>>>>>>>>|<c=1>|<<補(bǔ)齊7個(gè)字節(jié)>>|
例2:
把例1中的struct變?yōu)?/p>

struct
{    double a;
     int b;
     char c; 
}A;

后輸出為16:
因?yàn)閟izeof(a)等于8,而到sizeof(b)=4時(shí)根據(jù)規(guī)定1,a相對(duì)于結(jié)構(gòu)體的地址偏移量要為4的整數(shù)倍,滿足條件不用補(bǔ)齊,到c時(shí),sizeof(c)=1,但是此時(shí)結(jié)構(gòu)體大小為13,不是8的整數(shù)倍,所以還要補(bǔ),3個(gè)字節(jié),所以等于16.內(nèi)存布局如下:
|<<<<<<<<<<<a=8>>>>>>>>>>|<<<<b=4>>>>|<c=1>|<<補(bǔ)齊3個(gè)字節(jié)>>|
例3:

union u
{
    int a[4];
    char b;
    double c;
};
struct s
{
    int a;
    u b;
};

u是聯(lián)合體,共用體表示幾個(gè)變量共用一個(gè)內(nèi)存位置,在不同的時(shí)間保存不同的數(shù)據(jù)類型和不同長(zhǎng)度的變量。在union中,所有的共用體成員共用一個(gè)空間,并且同一時(shí)間只能儲(chǔ)存其中一個(gè)成員變量的值。當(dāng)一個(gè)共用體被聲明時(shí), 編譯程序自動(dòng)地產(chǎn)生一個(gè)變量, 其長(zhǎng)度為聯(lián)合中最大的變量長(zhǎng)度。所以sizeof(u)的大小為16字節(jié)。S是個(gè)結(jié)構(gòu)體,s中a占4個(gè)字節(jié),加上u的16字節(jié),總共是20字節(jié)。但是根據(jù)VC規(guī)定的第二條,需要補(bǔ)充為double 字節(jié)的倍數(shù),所以會(huì)添加4字節(jié)??偣彩?4字節(jié)。

5.類:

空類大?。?(空類也要實(shí)例化,所謂類的實(shí)例化就是在內(nèi)存中分配一塊地址,每個(gè)實(shí)例在內(nèi)存中都有獨(dú)一無(wú)二的地址。同樣空類也會(huì)被實(shí)例化,所以編譯器會(huì)給空類隱含的添加一個(gè)字節(jié),這樣空類實(shí)例化之后就有了獨(dú)一無(wú)二的地址了。所以空類的sizeof為1。解釋源自:http://blog.csdn.net/hairetz/article/details/4171769暫且認(rèn)同了,懶得深究了。
我總結(jié)的只需要記住兩條規(guī)則:

  1. 類的大小為類的非靜態(tài)成員數(shù)據(jù)的類型大小與虛指針(如果有的話)之和,也就是說(shuō)靜態(tài)成員數(shù)據(jù)和普通成員函數(shù)不作考慮。具體原因可以參考《深度探索C++對(duì)象模型》一書中關(guān)于C++對(duì)象模型的解釋,只有非靜態(tài)成員數(shù)據(jù)和虛指針是放在一起的,其他的都不放在一起。
  2. 類的總大小也遵守類似結(jié)構(gòu)體字節(jié)對(duì)齊的調(diào)整規(guī)則。
    幾種簡(jiǎn)單情況需要記?。嚎疹悶?,單一繼承的空類空間也為1,多重繼承的空類空間還是為1。但是虛繼承的空類設(shè)計(jì)到虛表(虛指針),所以為4。程序員面試寶典也就到此為止。其他情況,沒(méi)有親自試驗(yàn)過(guò)不敢亂說(shuō)。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容