首页 >后端开发 >C++ >堆或堆栈:'new”在哪里为 C# 结构分配内存?

堆或堆栈:'new”在哪里为 C# 结构分配内存?

Susan Sarandon
Susan Sarandon原创
2025-01-13 15:02:46232浏览

Heap or Stack: Where Does `new` Allocate Memory for C# Structs?

C# 结构和“新”运算符:堆与堆栈分配

C# 中结构体的 new 运算符引入了内存分配(堆或堆栈)的复杂性。与总是在堆上分配的类不同,结构表现出微妙的行为。

无参数构造函数的用法

使用 new 和无参数构造函数(例如 new Guid()),在堆栈上分配结构内存。 根据 CLI 规范,C# 编译器将其视为零初始化,而不是构造函数调用。

带参数的构造函数

new 与参数化构造函数(例如 new Guid(someString))一起使用会导致上下文相关的分配:

  • 临时值:当结构体用作临时值(例如方法参数)时,生成的中间语言(IL)会分配堆栈内存并执行构造函数。
  • 变量或字段赋值: 分配给局部变量或字段涉及初始 initobj 分配,然后是构造函数调用。 使用不同构造函数的后续赋值将覆盖同一内存位置中的现有数据。
  • 方法调用:方法调用利用ldloca来获取变量的地址。 然后使用 initobj (无参数构造函数)或构造函数调用(参数化构造函数)初始化此缓存地址,从而实现内存重用。

总结

虽然从概念上讲,对结构的每个 new 调用可能看起来都是分配堆栈内存,但实际情况更为复杂。 分配行为在很大程度上取决于上下文。 理解这种细微差别对于高效的代码和防止不可预见的并发症至关重要。

以上是堆或堆栈:'new”在哪里为 C# 结构分配内存?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn