我如何计算(手动)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。这就混淆了…从我身体里出来!谢谢大家!
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);
}