书上说,结构体的创建总是在栈上面,那么我如果写new MyStruct这个也是在栈上面吗?
(1) Plus: 我能否通过debug窗口来观察和证明某个new出来的结构体到底是在栈上,还是在堆上呢?
(2) 是否可以把一个struct类型的实例传递给一个需要有obj类型参数的函数?
struct是结构体,按值传递,传给一个obj类型,会有隐含的装箱操作对吧,也就是有一个额外的从栈到堆的拷贝。
可是我如果按值操作的话,参数传递也是一个拷贝啊,代价上有什么不同吗?
------解决思路----------------------
结构体既可以是在栈上
也可以在堆上,比如:
IEnumerator<SomeStruct> foo()
{
SomeStruct s = new SomeStruct(); //s在堆上
yield return s;
}
------解决思路----------------------
我记得《clr via c#》有讨论这个过程,还有配图~~ 你可以详细看看
struct是结构体,按值传递,传给一个obj类型,会有隐含的装箱操作对吧,也就是有一个额外的从栈到堆的拷贝。
可是我如果按值操作的话,参数传递也是一个拷贝啊,代价上有什么不同吗?
从我对底层的理解 也就是所谓的 堆栈平衡
因为值类型 长度固定,分配和回收速度快
而引用类型 由于长度不固定,所以分配和回收都是要计算的
另外就算是struct,如果是很大的struct,那么建议加上ref
记得C++ 函数传递都是值传递,你还要自己实现值传递过程中是怎么复制的,所以通常用上指针
------解决思路----------------------
结构体不一定在堆栈上,如果结构体是一个类的成员,它就在堆上。
------解决思路----------------------
结构体就是值类型,什么时候在栈上,什么时候在堆上,跟所有的值类型一样