一个关于结构体性能和内存分配的问题
<p>在菜鸟教程上学习C#结构体这一节时(https://www.runoob.com/csharp/csharp-struct.html),里面提到了一个关于结构体性能和内存分配的问题:“<em>结构体是值类型且在栈上分配内存;而类是引用类型,可能涉及更多的内存开销和管理</em>。”于是在vs2022环境下对代码进行了反汇编。<br></p>
<pre><code class="language-cs">using System;
/*原代码*/
namespace HelloWorld
{
class Program
{
struct Struct
{
public string str;
}
class Class
{
public string str = new string("Where there is a will, there is a way !");
}
static void Main(string[] args)
{
Struct s1 = new Struct();
s1.str = "Hello, World!";
Struct s2 = s1;
Class c1 = new Class();
}
}
}
</code></pre>
<p> </p>
<pre><code class="language-asm"># 反汇编代码
static void Main(string[] args)
{
088F3EF8push ebp
088F3EF9mov ebp,esp
088F3EFBpush edi
088F3EFCpush esi
088F3EFDpush ebx
088F3EFEsub esp,3Ch
088F3F01vxorps xmm4,xmm4,xmm4
088F3F05vmovdqu xmmword ptr ,xmm4
088F3F0Avmovdqu xmmword ptr ,xmm4
088F3F0Fvmovdqu xmmword ptr ,xmm4
088F3F14xor eax,eax
088F3F16mov dword ptr ,eax
088F3F19mov dword ptr ,eax
088F3F1Cmov dword ptr ,ecx
088F3F1Fcmp dword ptr ds:,0
088F3F26je HelloWorld.Program.Main(System.String[])+035h (088F3F2Dh)
088F3F28call 542824F0
088F3F2Dnop
Struct s1 = new Struct();
088F3F2Exor ecx,ecx
088F3F30mov dword ptr ,ecx
s1.str = "Hello, World!";
088F3F33mov dword ptr ,8B5623Ch
Struct s2 = s1;
088F3F3Amov ecx,dword ptr
088F3F3Dmov dword ptr ,ecx
Class c1 = new Class();
088F3F40mov ecx,0AEEDC9Ch
088F3F45call CORINFO_HELP_NEWSFAST (051E300Ch)# 有关内存分配的一个函数(Copilot AI解释)
088F3F4Amov dword ptr ,eax
088F3F4Dmov ecx,dword ptr
088F3F50call HelloWorld.Program+Class..ctor() (0AF09AD0h)# 构造函数(Copilpt AI解释)
088F3F55mov eax,dword ptr
088F3F58mov dword ptr ,eax
}
</code></pre>
<p> </p>
<p>由于C#代码运行在.net运行时环境上(类似于jvm虚拟机环境),所以无法直接查看进程的实际内存情况。可以看到结构体对象分配在栈上,并且可以得出<code>dword ptr </code>与<code>dword ptr </code>均为指针,其中<code>8B5623Ch</code>为字符串常量的地址,而类对象则分配在堆上,<code>dword ptr </code>为类对象的地址。</p>
</div>
<div id="MySignature" role="contentinfo">
<p>本文来自博客园,作者:Reimual,转载请注明原文链接:https://www.cnblogs.com/Reimual/p/19142445</p><br><br>
来源:https://www.cnblogs.com/Reimual/p/19142445
頁:
[1]