当前位置: 代码迷 >> C# >> C#用new回创建一个结构体的时候,这个结构体的实例到底是在栈上面,还是在堆上面
  详细解决方案

C#用new回创建一个结构体的时候,这个结构体的实例到底是在栈上面,还是在堆上面

热度:76   发布时间:2016-05-05 03:24:48.0
C#用new来创建一个结构体的时候,这个结构体的实例到底是在栈上面,还是在堆上面?
本帖最后由 laearner 于 2015-06-14 18:23:23 编辑
书上说,结构体的创建总是在栈上面,那么我如果写new MyStruct这个也是在栈上面吗?
(1) Plus: 我能否通过debug窗口来观察和证明某个new出来的结构体到底是在栈上,还是在堆上呢?
(2) 是否可以把一个struct类型的实例传递给一个需要有obj类型参数的函数? 

struct是结构体,按值传递,传给一个obj类型,会有隐含的装箱操作对吧,也就是有一个额外的从栈到堆的拷贝。
可是我如果按值操作的话,参数传递也是一个拷贝啊,代价上有什么不同吗?
------解决思路----------------------
引用:
Quote: 引用:

1. 楼主你已经搞清楚哪里是堆哪里是栈了吗?
2. C#里所有类型都是object,当然可以,


我知道堆和栈的区别
我的问题,其实就是想知道我new出来一个结构体的时候,这个东东到底在栈上还是在堆上。
谢谢

结构体既可以是在栈上
也可以在堆上,比如:
IEnumerator<SomeStruct> foo()
{
SomeStruct s = new SomeStruct(); //s在堆上
yield return s;
}

------解决思路----------------------
我记得《clr via c#》有讨论这个过程,还有配图~~ 你可以详细看看


struct是结构体,按值传递,传给一个obj类型,会有隐含的装箱操作对吧,也就是有一个额外的从栈到堆的拷贝。
可是我如果按值操作的话,参数传递也是一个拷贝啊,代价上有什么不同吗?

从我对底层的理解  也就是所谓的 堆栈平衡
因为值类型 长度固定,分配和回收速度快
而引用类型 由于长度不固定,所以分配和回收都是要计算的

另外就算是struct,如果是很大的struct,那么建议加上ref 
记得C++ 函数传递都是值传递,你还要自己实现值传递过程中是怎么复制的,所以通常用上指针

------解决思路----------------------
结构体不一定在堆栈上,如果结构体是一个类的成员,它就在堆上。
------解决思路----------------------
结构体就是值类型,什么时候在栈上,什么时候在堆上,跟所有的值类型一样
  相关解决方案