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

laearner 2015-06-14 06:22:20
书上说,结构体的创建总是在栈上面,那么我如果写new MyStruct这个也是在栈上面吗?
(1) Plus: 我能否通过debug窗口来观察和证明某个new出来的结构体到底是在栈上,还是在堆上呢?
(2) 是否可以把一个struct类型的实例传递给一个需要有obj类型参数的函数?

struct是结构体,按值传递,传给一个obj类型,会有隐含的装箱操作对吧,也就是有一个额外的从栈到堆的拷贝。
可是我如果按值操作的话,参数传递也是一个拷贝啊,代价上有什么不同吗?
...全文
1677 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
结构体就是值类型,什么时候在栈上,什么时候在堆上,跟所有的值类型一样
threenewbee 2015-06-14
  • 打赏
  • 举报
回复
结构体不一定在堆栈上,如果结构体是一个类的成员,它就在堆上。
moonwrite 2015-06-14
  • 打赏
  • 举报
回复
我记得《clr via c#》有讨论这个过程,还有配图~~ 你可以详细看看 struct是结构体,按值传递,传给一个obj类型,会有隐含的装箱操作对吧,也就是有一个额外的从栈到堆的拷贝。 可是我如果按值操作的话,参数传递也是一个拷贝啊,代价上有什么不同吗? 从我对底层的理解 也就是所谓的 堆栈平衡 因为值类型 长度固定,分配和回收速度快 而引用类型 由于长度不固定,所以分配和回收都是要计算的 另外就算是struct,如果是很大的struct,那么建议加上ref 记得C++ 函数传递都是值传递,你还要自己实现值传递过程中是怎么复制的,所以通常用上指针
Poopaye 2015-06-14
  • 打赏
  • 举报
回复
引用 3 楼 laearner 的回复:
[quote=引用 1 楼 shingoscar 的回复:] 1. 楼主你已经搞清楚哪里是堆哪里是栈了吗? 2. C#里所有类型都是object,当然可以,
我知道堆和栈的区别 我的问题,其实就是想知道我new出来一个结构体的时候,这个东东到底在栈上还是在堆上。 谢谢 [/quote] 结构体既可以是在栈上 也可以在堆上,比如:
IEnumerator<SomeStruct> foo()
{
	SomeStruct s = new SomeStruct(); //s在堆上
	yield return s;
}
遥望那些年 2015-06-14
  • 打赏
  • 举报
回复
结构体是在栈上的,读写速度快 装箱到堆上的话,首先你创建的过程就要有一步内存申请的过程。读写还要有一步取地址的过程。
laearner 2015-06-14
  • 打赏
  • 举报
回复
引用 1 楼 shingoscar 的回复:
1. 楼主你已经搞清楚哪里是堆哪里是栈了吗? 2. C#里所有类型都是object,当然可以,
我知道堆和栈的区别 我的问题,其实就是想知道我new出来一个结构体的时候,这个东东到底在栈上还是在堆上。 谢谢
Poopaye 2015-06-14
  • 打赏
  • 举报
回复
拷贝的代价得看你的结构体有多大
Poopaye 2015-06-14
  • 打赏
  • 举报
回复
1. 楼主你已经搞清楚哪里是堆哪里是栈了吗? 2. C#里所有类型都是object,当然可以,

111,095

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧