C# 结构和“新”运算符:堆与堆栈分配
C# 中结构体的 new
运算符引入了内存分配(堆或堆栈)的复杂性。与总是在堆上分配的类不同,结构表现出微妙的行为。
无参数构造函数的用法
使用 new
和无参数构造函数(例如 new Guid()
),在堆栈上分配结构内存。 根据 CLI 规范,C# 编译器将其视为零初始化,而不是构造函数调用。
带参数的构造函数
将 new
与参数化构造函数(例如 new Guid(someString)
)一起使用会导致上下文相关的分配:
initobj
分配,然后是构造函数调用。 使用不同构造函数的后续赋值将覆盖同一内存位置中的现有数据。ldloca
来获取变量的地址。 然后使用 initobj
(无参数构造函数)或构造函数调用(参数化构造函数)初始化此缓存地址,从而实现内存重用。总结
虽然从概念上讲,对结构的每个 new
调用可能看起来都是分配堆栈内存,但实际情况更为复杂。 分配行为在很大程度上取决于上下文。 理解这种细微差别对于高效的代码和防止不可预见的并发症至关重要。
以上是堆或堆栈:'new”在哪里为 C# 结构分配内存?的详细内容。更多信息请关注PHP中文网其他相关文章!