为了账号安全,请及时绑定邮箱和手机立即绑定

结构与课程

结构与课程

C#
慕桂英546537 2019-07-30 11:28:10
结构与课程我即将在代码中创建100,000个对象。它们很小,只有2或3个属性。我将它们放在一个通用列表中,当它们存在时,我将循环它们并检查值a并可能更新值b。将这些对象创建为类还是结构更快/更好?编辑一个。属性是值类型(我认为字符串除外?)湾 他们可能(我们还不确定)有一个验证方法编辑2我想知道:堆上的对象和堆栈是否由垃圾收集器同等处理,或者它的工作方式有何不同?
查看完整描述

3 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

难道更快创建这些对象的类或结构?

您是唯一可以确定该问题答案的人。尝试两种方式,衡量有意义的,以用户为中心的相关性能指标,然后您将了解更改是否对相关方案中的真实用户产生了有意义的影响。

结构消耗较少的堆内存(因为它们更小且更容易压缩,而不是因为它们“在堆栈中”)。但是他们需要比参考副本更长的时间来复制。我不知道您的内存使用或速度的性能指标; 这里有一个权衡,你就是知道它是什么的人。

它是更好的创建这些对象的类或结构?

也许是阶级,也许是结构。根据经验:如果对象是:
1。小
2.逻辑上是不可变的值
3.有很多它们
然后我会考虑把它变成一个结构。否则我会坚持使用引用类型。

如果你需要改变一个struct的某个字段,通常最好构建一个构造函数,该构造函数返回一个正确设置字段的整个新结构。这可能稍微慢一些(测量它!)但在逻辑上更容易推理。

垃圾收集器是否对堆和堆栈上的对象进行了相同的处理?

,它们不一样,因为堆栈上的对象是集合的根。垃圾收集器不需要问“堆栈中的这个东西是活着的吗?” 因为这个问题的答案总是“是的,它在堆栈上”。(现在,你不能依赖它来保持一个对象存活,因为堆栈是一个实现细节。允许抖动引入优化,例如,注册通常是堆栈值的东西,然后它永远不会在堆栈上所以GC并不知道它仍然存在。一旦注册的对象不能再次被读取,就可以积极收集它的后代。

但垃圾收集器确实必须将堆栈上的对象视为活动,就像它将任何已知的活动对象视为活着一样。堆栈上的对象可以引用需要保持活动的堆分配对象,因此GC必须将堆栈对象视为活动堆分配对象,以便确定实时集。但显然它们不是为了压缩堆被视为“活动对象”,因为它们首先不在堆上。

明白了吗?


查看完整回答
反对 回复 2019-07-30
  • 3 回答
  • 0 关注
  • 335 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信