我如何计算(手动)SizeOf一个字符串,也做一个类添加到大小

本文关键字:一个 添加 字符串 手动 SizeOf 何计算 计算 | 更新日期: 2023-09-27 18:16:27

第一部分:

我有一个字符串…

string sTest = "This is my test string";

我如何(手动,没有代码)确定SizeOf字符串?它最终应该是什么?你是怎么弄到这个尺寸的?


第二部分:

我有一节课……

[StructLayout(LayoutKind.Sequential)]
public class TestStruct
{
    public string Test;
}

我用它…

TestStruct oTest = new TestStruct();
oTest.Test = "This is my test string";

第一部分和第二部分在尺寸上有什么不同吗?


更新:

这样做的目的是使用大小作为创建内存映射文件的一种方式。

long lMapSize = System.Runtime.InteropServices.Marshal.SizeOf(oTest);
mmf = MemoryMappedFile.CreateOrOpen("testmap", lMapSize);

只是觉得值得注意。当前lMapSize = 4。这就混淆了…从我身体里出来!谢谢大家!

我如何计算(手动)SizeOf一个字符串,也做一个类添加到大小

string是引用类型,因此其他类或结构或局部方法变量中的字段将是指针- IntPtr。指针的大小在32位pc上是32位,在64位pc上是64位。
如果你想知道字符串本身的大小,你需要知道你要使用哪种编码。Encoding.UTF8.GetByteCount("aaa")将返回"aaa"在UTF8编码下的大小。但这将只返回字符串的大小,而不是。net对象的大小。
看起来没有准确的方法从代码中计算对象的大小。如果你想知道在你的应用程序中发生了什么,有一些内存分析器,只需搜索"c#内存分析器"。我只在堆射中使用过单分析器,所以我不能向你推荐哪个分析器更好。
另一种方法是将WinDBG与sos.dll和sosex.dll一起使用。在这里你可以找到使用sos.dll的例子。


更新:
还可以将对象序列化为字节数组。序列化器将添加一些额外的数据,如程序集名称和版本。

byte[] bytes;
using (MemoryStream stream = new MemoryStream())
{
    IFormatter formatter = new BinaryFormatter();
    formatter.Serialize(stream, myObject);
    bytes = stream.ToArray();
}
using (MemoryStream stream = new MemoryStream(bytes))
{
    IFormatter formatter = new BinaryFormatter();
    myObject = formatter.Deserialize(stream);
}