首页 > 后端开发 > C++ > 堆还是栈:C# 中'new”结构体在哪里分配?

堆还是栈:C# 中'new”结构体在哪里分配?

Patricia Arquette
发布: 2025-01-13 15:06:46
原创
789 人浏览过

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

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板