C# 中 new
运算符对结构体的内存分配:堆还是栈?
使用 new
运算符实例化类时,内存分配在堆上。然而,new
运算符作用于结构体的行为取决于具体场景。让我们探讨一下这些差异:
带参数的构造函数
使用 new
调用结构体的带参数构造函数时,内存分配在栈上。这类似于为值类型的局部变量赋值。
<code class="language-csharp">Guid local = new Guid("");</code>
这段赋值的 IL 代码使用 newobj
在栈上分配内存,并使用提供的字符串初始化值。
无参数的构造函数
使用 new
调用结构体的无参数构造函数时,行为取决于上下文:
不会在栈上分配内存。而是使用 initobj
初始化现有的存储位置(字段或局部变量)。值类型在原地构造。
<code class="language-csharp">Guid field; ... field = new Guid();</code>
在栈上分配一个临时的局部变量,并使用 initobj
初始化它。然后将该值作为参数传递给方法。
<code class="language-csharp">MethodTakingGuid(new Guid());</code>
不会在栈上分配内存。值类型直接在实例或静态变量的存储位置构造。
<code class="language-csharp">myInstance.GuidProperty = new Guid();</code>
结论
new
运算符与结构体一起使用时的分配行为取决于上下文。对于带参数的构造函数,内存始终分配在栈上。对于无参数的构造函数,取决于上下文,内存可能不会分配在栈上。此行为很大程度上取决于编译器在转换 C# 代码时生成的 IL 指令。
以上是堆还是栈:C# 中'new”结构体在哪里分配?的详细内容。更多信息请关注PHP中文网其他相关文章!