C#中字符串连接中的内存分配

时间:2013-04-09 06:37:00

标签: c# memory memory-management string-concatenation

让,

string a = “Test”;
string b = “test 2”;
string c  = a + b

c的输出为"Testtest 2"

我想知道内存是如何分配的?

1 个答案:

答案 0 :(得分:3)

string a = "Test";

您创建一个名为a的引用,它指向内存中的"Test"对象。

string b = "test 2";

您创建一个名为b的引用,它指向内存中的“test 2”对象。

string c  = a + b;

您正在为a + b分配新的内存地址(此过程使用String.Concat方法。)因为.NET中的字符串是 immutable 。然后c引用这个新的内存地址。

这是IL的代码;

  IL_0000:  nop
  IL_0001:  ldstr      "Test"
  IL_0006:  stloc.0
  IL_0007:  ldstr      "test 2"
  IL_000c:  stloc.1
  IL_000d:  ldloc.0
  IL_000e:  ldloc.1
  IL_000f:  call       string [mscorlib]System.String::Concat(string,
                                                              string)
  IL_0014:  stloc.2
  IL_0015:  ldloc.2
使用

stloc.0,它将评估堆栈顶部的值存储到本地内存插槽0中。

ldstr指令用于将字符串加载到内存或评估堆栈中。在可以使用之前,必须将值加载到评估堆栈中。

ldloc指令是一个加载本地指令。 Ldloc将局部变量的值放在堆栈上。