我正在熟悉 CLR,我想知道我是否在代码中编写类似的内容:
String s = null;
CLR 是否通过保留一些空间并添加开销字段并且没有任何值来在地址空间中分配内存?
我试图在《CLR via C#》一书中找到答案,但失败了
String 是一种通过引用传递的不可变数据类型。这意味着当您创建字符串时,会在内存中分配字符集合。上述字符集合如果被修改,则每次对其应用修改时都会在内存中重新分配。空字符串必须存储一个指向对象内存地址的指针,并且还表明为特定字符串分配的内存为 0,因此需要
null
关键字。指针使用的内存量为 4 和 8 字节,具体取决于计算机使用的 CPU 架构(32 位/64 位)。如果您担心内存占用,您应该使用 StringBuilder
数据结构。 StringBuilder
是一种可变数据类型,因此允许您更改字符串的值,而无需为每次修改重新分配字符串。
// INITIAL MEMORY ALLOCATION ( 1 ALLOCATION )
string s = "Stack";
// ALLOCATE STRING 'Overflow' AND REALLOCATE 's' STRING TO CONCATENATE ( 2 ALLOCATIONS )
s += "Overflow";
// ALLOCATE STRING ' NEW ' AND REALLOCATE 's' STRING TO CONCATENATE ( 2 ALLOCATIONS )
s += " New ";
// FINAL RESULT 5 MEMORY ALLOCATIONS
// INITIAL MEMORY ALLOCATION ( 1 ALLOCATION )
StringBuilder build = new StringBuilder("Stack");
// ALLOCATE STRING 'Overflow' ( 1 ALLOCATION )
build.Append("Overflow");
// ALLOCATE STRING ' NEW ' ( 1 ALLOCATION )
build.Append(" New ");
// FINAL RESULT 3 MEMORY ALLOCATIONS