青山冶金 發表於 2025-10-15 03:26:00

一个关于结构体性能和内存分配的问题

<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]
查看完整版本: 一个关于结构体性能和内存分配的问题