那麼談本次內容之前,我們先來看乙個問題「乙個空類所佔位元組是多少?」
class
emptyclass
;
大家猜一猜這個類佔不佔位元組呢,看上去它什麼都沒有那麼是不是可以認為它是0位元組呢,其實不然我們可以用sizeof看一下
cout<<
sizeof
(emptyclass)
;// 輸出:1
為什麼是輸出1,原因是因為它需要乙個起始位址,哪怕是空類我們也可以例項化的,例項化後它必然要占有乙個位址既然位址屬於這個物件那麼它必然最少要占有乙個位元組的。
那麼我們再來猜一猜成員函式佔不佔位元組呢
class
emptyclass
void
print2()
};cout<<
sizeof
(emptyclass)
;// 輸出:1
從上方的**中我們可以看出成員函式是不佔位元組的,那麼是不是只有成員變數才會占有位元組呢,其實也不然,大家別忘了成員函式中還有一種是虛函式,那麼虛函式佔不佔位元組呢
class
emptyclass};
cout<<
sizeof
(emptyclass)
;// 輸出:8 (這個大小根據平台來決定,我這裡是64位)
那根據上面的例子來看我是不是在新增乙個虛函式它所佔位元組就會是16呢,其實不會的,原理後面解釋,我們先來看**例子
class
emptyclass
virtual
void
print2()
};cout<<
sizeof
(emptyclass)
;// 輸出:8
原因是因為如果內部有虛函式他就會建立乙個虛函式表(virtual table) ,而這在64位的情況下是只佔8位,因為這個8位可以理解為是一根指標儲存了虛表的起始位址。
那麼解釋完了成員函式這方面後,我們來看看成員變數是怎麼佔的呢
class
emptyclass
;cout<<
sizeof
(emptyclass)
;// 輸出:16
為什麼是16呢,我們知道64位的情況下char*佔8個位元組,int佔4個位元組,但是因為有』 位元組對齊 『所以有了這樣的情況,具體關於位元組對齊的大家可以去看一看,這裡不去**了。
class
emptyclass
;cout<<
sizeof
(emptyclass)
;// 輸出:16
總結一下就是,空類會佔1個位元組,如果有了成員變數或者虛函式的話就會去計算原本的大小而不會再計算那個1了,至於普通成員函式和靜態成員函式以及靜態成員變數的大小儲存於物件外部不計算於類所佔。 KMP演算法的next陣列是怎麼算的
首先我們來看看 部分匹配表 next 是怎麼產生的。先介紹字首,字尾是什麼 對於乙個字串來說,如單詞 spark 來說 字串 spark 字首 s,sp,spa,spar 字尾 park,ark,rk,k 部分匹配值 就是 字首 和 字尾 的最長的共有元素的長度。以 ababcabaa 為例 a 的...
類所佔記憶體的大小
成員函式還是以一般的函式一樣的存在。a.fun 是通過fun a.this 來呼叫的。所謂成員函式只是在名義上是類裡的。其實成員函式的大小不在類的物件裡面,類所佔記憶體的大小不包括成員函式的大小,虛擬成員函式除外。同乙個類的多個物件共享函式 而我們訪問類的成員函式是通過類裡面的乙個指標實現,而這個指...
C 類是怎麼執行的?
c 類是怎麼執行的?public class person 不寫,預設也有個空的 public person 不寫,預設也有個空的 public string name 屬性,只對本類開放寫許可權 這樣乙個人就出現了,有兩個構造方法 第乙個是類的建構函式,第二個是例項構造方法,第乙個只對本類公開,它...