c# - .net 对象大小填充?

标签 c# .net .net-4.0 clr

msdn说是

the sizeof operator can be used only in unsafe code blocks. Although you can use the Marshal.SizeOf method, the value returned by this method is not always the same as the value returned by sizeof.

Marshal.SizeOf returns the size after the type has been marshaled, whereas sizeof returns the size as it has been allocated by the common language runtime, including any ** padding **.

我曾经读过这本书:c# via clr(第 522 页)

那个: enter image description here

问题:

1) 做这里提到的填充:

enter image description here

和书中提到的一样吗?

2) 如果我的对象类型为 Person - 我怎么知道它在 MEMORY 中的TRUE SIZE

编辑 - 为什么我需要它?

请注意this :

他们有阅读记录样本:

 using (var accessor = mmf.CreateViewAccessor(offset, length))
            {

                int colorSize = Marshal.SizeOf(typeof(MyColor)); //<--------HERE
                MyColor color;


                for (long i = 0; i < length; i += colorSize)
                {
                    accessor.Read(i, out color);
                    color.Brighten(10);
                    accessor.Write(i, ref color);
                }
            }
        }

如果 MARSHAL.sizeOF 报告的大小不是sizeOF 的大小,那么 - 哪个应该我选择 ?它必须是准确的!

根据这个示例,他们不考虑填充,他们应该...(或不...)

最佳答案

这可能看起来不诚实 - 但从内存映射文件的角度来看,您感兴趣的大小与内存中该对象的大小不同。它们可能被称为内存映射文件,但在 .Net 中,这并不一定意味着完全与在 native 代码中一样。 (尽管底层实现仍然相同 - 逻辑内存的一部分映射到文件的一部分,因此名称仍然正确)

sizeof 返回对象在物理内存中的正确大小,包括任何填充字节等。因此,如果您需要知道 native 内存术语中对象的确切大小,请使用它(但是这不适用于内存映射文件,我稍后会解释)。

如文档所述,Marshal.SizeOf 从 .Net 的角度报告对象的大小,不包括两个隐藏的数据项;仅由运行时使用。

您复制的示例使用 Marshal.SizeOf,因为填充值仅与内存中的物理对象相关。当对象被序列化时,只有逻辑 .Net 数据被序列化。当再次加载对象时,这两个填充值将根据此时的运行时状态重新分配。例如。类型指针可能不同。序列化它们是没有意义的。这就像将 native 指针(不是偏移量)序列化到磁盘 - 它指向的数据下一次不太可能位于同一位置。

因此 - 如果您想知道 100 个 Color 对象的数组在物理内存中使用了多少 - 使用 sizeof;如果您想知道相同数据的内存映射文件有多大,请使用 Marshal.SizeOf

关于c# - .net 对象大小填充?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10602388/

相关文章:

c# - Azure Functions EventGrid 触发器

c# - 在查询之前对 ObservableCollection 进行空检查

c# - 找到匹配的单词

.net - 如何使用缩写的时区显示 DateTime?

可以执行循环中任何代码的 C# 方法

c# - Microsoft 图表控件 : how to set chart width to width of surrounding div?

C# 2.0 双重处理 - 奇怪的行为

.net - DefaultConnectionLimit 的最大值

c# - 如何在播放时比较 MediaElement 的准确位置

c# - 为什么 Ninject 不使用 InCallScope 释放已处置的对象?