繁体   English   中英

一个字符串在x64中占用多少字节?

[英]How many bytes does a string take up in x64?

为了学习,我试图了解C#字符串是如何内部存储在内存中的。

根据此博客文章 ,C#字符串大小为(.NET Framework 4.0为x64):

26 + 2 * length

具有单个字符的字符串将占用(26 + 2 * 1) / 8 * 8 = 32 bytes 这确实与我所测量的相似。

让我感到困惑的是这26个字节的开销是什么。

我已经运行了以下代码并检查了内存:

string abc = "abcdeg";
string aaa = "x";
string ccc = "zzzzz";

在此处输入图片说明

AFAIK这些块如下:

  • 绿色:同步块(8字节)
  • 青色:类型信息(8个字节)
  • 黄色:长度(4个字节)
  • 粉色:实际字符:每个字符2个字节+ NULL终止符2个字节。

查看“ x”字符串。 实际上是32个字节(计算得出)。

无论如何,如果用零填充,它看起来像字符串的结尾。 “ x”字符串可能会在NULL终止符的两个字节之后结束,并且仍然是内存对齐的(因此是24个字节)。 为什么我们需要额外的8个字节?

我已经对其他(更大)的字符串大小进行了类似的实验。 看起来总会有8个字节。

正如Hans Passant所建议的,在字符串对象的末尾添加了一个额外的字段,该字段为4个字节(在x64中,可能需要另外4个字节来填充)。

所以最后我们有了:

= 8 (sync) + 8 (type) + 4 (length) + 4(extra field) + 2 (null terminator) + 2 * length 
= 26 + 2 * length

因此,乔恩·斯基特(Jon Skeet)的博客文章是对的(怎么可能错了?)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM