原則:
1.C++的類別類型是值類型,也就是說實例化個類別物件的時候,記憶體分配在堆疊上。
這樣如果類別類型這樣定義的時候
class A
{
public:
int i;
A a;
}
就會陷入無限的死循環,因為實例化一個A的物件object的時候,A要根據成員類型去計算這樣一個物件要佔用的記憶體空間(資料成員根據類型決定,成員函數的程式碼存一份在exe映射到內存,用一個指針指向內存地址即可,另外再加一些類描述信息,但sizeof不顯示這部分描述信息的內存佔用),遇到自身類型的對象a的時候,又去計算a所用的記憶體空間,而a又是A型,所以重複進行。
所以在C++中
可以包含自身類型的指標(鍊錶中經常這樣使用)
class A
{
public:
int i;
A * pa;
}
指標變數所佔的記憶體空間是容易確定的,幾位的機器字長,指標變數即佔用多少空間
2、C#中類別類型是引用類型,本質是個指針
所以C#中所有類別物件本身都是4位元組(32位元機器),包含一個記憶體位址,這個位址指向堆記憶體空間
class A
{
public int i;
public A a;
}
A object = new A();
object本身佔用4位元組內存,存放堆內存地址,這塊內存的大小是8字節(int 4字節,a也是四字節),當成員a實例化的時候,只是a的內容不是null了,存放堆記憶體中的另一個位址,指向一塊8位元組記憶體空間。
因為能確定A的一個物件佔用多少記憶體空間(4位元組,C#所有類別物件都是佔4字節,在32位元機中),所以可以定義
-