问个比较小白的问题,.Net为什么不允许显示指定对象分配的内存位置,默认是分配在堆上,为什么不可以显示指定分配在栈上呢?这样的话,有些局部对象在方法执行完之后就可以直接释放,减轻GC压力.
显式的指定分配在栈上可以用unsafe关键字声明
因为一些程序员不能很好的分配和释放内存,内存又是比较宝贵的资源,不正确的释放会导致内存泄露,.net不希望这样,决定自己封装处理,垃圾回收器。
主要是减少程序员对内存的直接访问,可以解放程序员回到业务的层面。现在.net的GC就是做了很多的工作,避免了以前c++ 和 c的内存泄露问题
首先,.NET在特定条件下是允许直接在栈上面分配资源的,就是unsafe其次,之所以不推荐这样使用是因为.NET有自己的垃圾回收机制,能解决大部分的内存回收问题,希望程序员不需要管理底层。
个人认为在栈上面直接分配资源不是为了减轻GC的压力,是为了效率,使用unsafe得当的话,可以制造很高的性能
在栈上分配资源和在堆上分配的话,速度基本是一样的吧?效率提升在哪里呢,我个人认为效率就是提升在资源的回收上,交给GC的话,如果方法调用特别频繁,对象创建就会非常频繁,每个创建的对象都需要GC来回收就会造成效率低下,除了这个,分配在栈上还会带来哪些效率提升啊?
@garry: 在栈上进行分配,使用指针去操作,可以是的我们的代码不在托管状态下运行,之所以直接在栈上分配可以让GC不回收,就是因为使用unsafe分配的时候使用了非托管指针,免去了拆箱装箱以及在托管下运行的效率损耗,最典型的例子就是高性能数组stackalloc带来的效率就很高,个人认为不是GC拖慢了.NET,而是因为装箱拆箱以及不恰当的对象使用拖慢了.NET
@天下狙击:
栈上分配不一定要使用指针的啊,值类型的对象都可以直接分配在栈上啊,而且也是在托管状态下运行的.
分配在栈或者堆上的对象只要不进行值类型到引用类型之间的转换都不需要装箱或者拆箱的吧.
GC影响性能主要原因是因为GC在回收对象释放对象的时候会挂起所有正在运行中的线程,回收完了才恢复.
而且GC回收的过程中还会调用对象的析构函数,这些都会带来时间消耗
另外GC是系统中的一个单点,所有运行中的堆对象的回收都由GC来负责,理论上分配在堆上的对象越多回收就越慢
分配在栈上的局部变量,函数退出之后就直接扔掉了,不会经过GC,也不会挂起线程,所以性能上来说要好一些.
不知道我的理解对否?