当变量值为null时,CLR是否会为其分配内存并添加开销字段?
关于
String s = null;的CLR内存分配问题 当你声明String s = null;时,CLR不会为String对象分配任何托管堆内存,也不会保留空间或添加String特有的开销字段,具体原因如下:
- 变量
s的存储逻辑:- 如果是局部变量,它会被分配在栈上,仅存储一个空引用(32位系统占4字节,64位系统占8字节),这个值仅代表“没有指向任何托管堆对象”。
- 如果是类的实例字段,它会作为类对象的一部分存在于托管堆中,但同样只存储空引用,不会额外分配String对象相关的内存。
- String对象的托管堆内存(包含SyncBlockIndex、长度字段、字符数组等开销与数据),只有在创建实际String实例时才会分配——比如使用字符串字面量(
"test")、new String()构造器,或是通过字符串拼接等操作生成新字符串的场景。
简言之,null只是一个“无指向”的标记,不会触发任何String对象的内存分配动作。
内容的提问来源于stack exchange,提问作者BestSnowWitch
相关产品推荐
相关产品推荐

