这个不是共享内存,b和a都是同一个对象的引用。

在C语言中,对一个结构体用等号赋值后,是将内存块复制了一个副本。在C++中,如果没有为结构体重载等号操作符,表现也和C一样。这是因为C/C++大量使用栈空间,栈空间中的对象是不稳定的,很容易被单方面释放,因此提倡对每一个栈对象都使用副本进行赋值。

但是在托管的语言中,由于采用了垃圾回收器,可以很方便地管理堆空间。堆空间可以在多个线程中共享,而栈空间则存在对象被释放的可能性,不能用于跨线程共享。一般的托管语言是尽量不使用栈空间的,对象都放进堆中。而堆空间的内存分配和释放会消耗大量的时间,另外,如果建立副本的话,就无法将堆中的对象用于多线程共享了。因此不论是托管语言还是原生语言,都建议对堆空间中的对象传指针或引用,而不是传副本。

这一想法也可能是来源于C++的编程。C++默认给函数传副本,但是程序员希望将运行速度最大化而大量使用引用,结果就是导致了大量的引用符号以及一个函数要分别写左引用和右引用的两接口。在专业的C++代码中,你将看到,除了向容器写对象有时是传副本的,其它情况下都是传引用。而如果容器本身就设计成保存指针的,那么向容器也只需要传指针就可以了。传副本的功能就变得多余起来。于是托管的编程语言干脆就取消传副本的设定,改成一律传引用。如果程序中确实需要副本,那就由程序员另外写一行代码生成新的对象再进行复制。但这种情况在几万行代码中也出现不了一次。