You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

x64环境下C#字符串内存占用及26字节开销构成问询

.NET Framework 4.0 x64 字符串内存开销拆解

嘿,你观察到的26 + 2 * length这个公式挺准确的——这其实是字符串在未做8字节对齐前的总内存占用,之后CLR会自动把它对齐到最近的8字节倍数,所以单字符字符串才会算出28字节后最终占用32字节。我来给你拆解这26字节的固定开销到底包含什么:

  • 通用对象头(16字节):这是所有.NET引用类型都具备的基础开销:
    • 8字节:同步块索引(SyncBlock Index),负责线程同步操作、缓存对象哈希码、支持COM互操作等场景
    • 8字节:方法表指针(MethodTable Pointer),CLR靠它识别对象类型,调用对应方法、访问元数据都依赖这个指针
  • 字符串专属字段与填充(10字节):
    • 4字节:m_length,一个int类型字段,存储字符串中Unicode字符的数量(注意不是字节数,.NET中每个char是2字节的UTF-16编码)
    • 4字节:m_flags,一个int类型的标志字段,记录字符串的状态信息——比如是否是驻留池中的字面量、哈希码是否已计算完成、是否为只读字符串等
    • 2字节:填充字节,目的是保证后续的字符数据(每个char占2字节)能按照自然对齐规则存储,避免内存访问性能损耗

当加上字符串的实际字符数据(总大小2 * length)后,整个字符串的内存占用会被CLR自动对齐到8字节边界——这就是单字符字符串计算值为28字节,最终实际占用32字节的原因。

另外提个小细节:你创建的那些字符串字面量("abcdeg"、"x"、"zzzzz"),CLR会自动将它们加入字符串驻留池,相同内容的字面量会共享同一个内存实例,要是你测内存时发现相同内容的字符串内存地址一致,别觉得奇怪哦。

内容的提问来源于stack exchange,提问作者tigrou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:43:44