原則:
1、C++的類類型是值類型,也就是說實(shí)例化個(gè)類對(duì)象的時(shí)候,內(nèi)存分配在棧上。
這樣如果類類型這樣定義的時(shí)候
class A
{
public:
int i;
A a;
}
就會(huì)陷入無(wú)限的死循環(huán),因?yàn)閷?shí)例化一個(gè)A的對(duì)象object的時(shí)候,A要根據(jù)成員類型去計(jì)算這樣一個(gè)對(duì)象要占用的內(nèi)存空間(數(shù)據(jù)成員根據(jù)類型確定,成員函數(shù)的代碼存一份在exe映射到內(nèi)存,用一個(gè)指針指向內(nèi)存地址即可,另外再加一些類描述信息,但sizeof不顯示這部分描述信息的內(nèi)存占用),遇到自身類型的對(duì)象a的時(shí)候,又去計(jì)算a所用的內(nèi)存空間,而a又是個(gè)A類型,所以重復(fù)進(jìn)行。
所以在C++中
可以包含自身類型的指針(鏈表中經(jīng)常這樣使用)
class A
{
public:
int i;
A * pa;
}
指針變量所占的內(nèi)存空間是容易確定的,幾位的機(jī)器字長(zhǎng),指針變量即占用多少空間
2、C#中類類型是引用類型,本質(zhì)是個(gè)指針
所以C#中所有類對(duì)象本身都是4字節(jié)(32位機(jī)),包含一個(gè)內(nèi)存地址,這個(gè)地址指向堆內(nèi)存空間
class A
{
public int i;
public A a;
}
A object = new A();
object本身占用4字節(jié)內(nèi)存,存放堆內(nèi)存地址,這塊內(nèi)存的大小是8字節(jié)(int 4字節(jié),a也是四字節(jié)),當(dāng)成員a實(shí)例化的時(shí)候,只是a的內(nèi)容不是null了,存放堆內(nèi)存中的另一個(gè)地址,指向一塊8字節(jié)內(nèi)存空間。
因?yàn)槟艽_定A的一個(gè)對(duì)象占用多少內(nèi)存空間(4字節(jié),C#所有類對(duì)象都是占4字節(jié),在32位機(jī)中),所以可以定義
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注