【发布时间】:2015-07-01 00:33:15
【问题描述】:
我在创建 String 类的对象时对内存分配感到困惑。我创建了一个示例应用程序,它演示了在声明字符串对象时分配了多少内存。然后我尝试增加字符串的长度以查看堆中总消耗内存的差异。
我的测试代码在这里
static void Main(string[] args)
{
long l1 = GC.GetTotalMemory(false);
long l2 = 0;
Console.WriteLine(l1.ToString());
myFunc();
l2 = GC.GetTotalMemory(false);
Console.WriteLine(l2.ToString());
Console.WriteLine(String.Format("Difference : {0}", (l2-l1)));
Console.ReadKey();
}
private static void myFunc()
{
String str = new String('a', 1);
}
当我执行这段代码时输出:
775596 //Memory at startup
816556 //After executing function
Difference : 40960
上面的输出对于长度为 0 到 2727 的字符串是相同的。例如,即使我创建了长度为 2727 的字符串对象,输出也与上面相同。
String str = new String('a', 2727);
但是,当我再增加一个值并为 2728 创建一个字符串时,输出会有所不同。
775596 //Memory at startup
822780 //After executing function
Difference : 47184
我也在 VB.Net 控制台应用程序中尝试过。在 VB.Net 中,0 到 797 长度的字符串输出相同。但是,当我将值增加到 798 时,它会发生变化。
不知道它是如何根据字符串长度分配内存的?
字符数组(字符串)表示它有 97 个字节的 2727 个项目(对于字符“a”)。我认为它将值与字符字节相乘。我知道字符类型的固定长度为 256 个字节。但是,我只是想知道为什么会这样?因此,我也尝试将字符从“a”更改为“z”。但是,结果和预期的一样。
谁能清楚地描述在声明任何字符串或其他类对象时如何分配内存?
【问题讨论】:
-
您可以随时查看源代码。 referencesource.microsoft.com/#mscorlib/system/…
-
另外,请记住,您实际上在内存检查之间分配了 2 个字符串,而不仅仅是一个。
Console.WriteLine(l1.ToString());也在分配一个字符串。 -
记住,字符不是字节! 1 个字符 = 2 个字节
标签: c# vb.net heap-memory dynamic-memory-allocation