原则:
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位机中),所以可以定义
-