c# - 以 C#的字节为单位,反射获取字段的大小

  显示原文与译文双语对照的内容
106 2

我有一个类,我想检查它的字段并最终报告每个字段的字节数。我假设所有字段都是 Int32.byte等类型。

如何才能轻松找到字段占用的字节数?

我需要一些东西

Int32 a;
//int a_size = a.GetSizeInBytes;
//a_size should be 4
时间:原作者:0个回答

138 2

基本上,它将依赖于空白,这可以能基于你所使用的CLR版本,处理器 等等 更容易。在创建一个基本点的基础上,使用 GC.GetTotalMemory,用引用的新实例填充 array,然后再调用 GetTotalMemory 。取一个值远离另一个,然后除以实例的数量。你应该预先创建一个实例,以确保没有新的JITted代码对。是的,它听起来跟听起来一样,但是我现在用了很好的效果。

刚刚我在想,为这个编写一个小的helper 类是一个好主意。如果你有兴趣请让我知道。

编辑:还有另外两个建议,我想把它们都解决。

首先,sizeof 操作符:这只显示了该类型在抽象中占用了多少空间,没有在它的周围应用填充。( 它包括结构中的填充,但不包括应用于其他类型中的该类型的变量的填充。)

接下来,Marshal.SizeOf: 这只显示编组后的非托管大小,而不是内存中的实际大小。就像文档明确说明的那样:

返回的大小实际上是非托管类型的大小。对象的非托管大小和托管大小可能不同。对于字符类型,大小受应用到该类的字符集值的影响。

同样,填充也会造成。

要澄清我的填充是相关的,请考虑以下两个类:

class FourBytes { byte a, b, c, d; }
class FiveBytes { byte a, b, c, d, e; }

在我的x86框中,FourBytes的实例需要 12个字节( 包括开销) 。FiveBytes的实例采用 16字节。唯一的区别是"e"变量- 所以需要 4字节?嗯。有点。of 。很明显,可以从FiveBytes移除任何单个变量,使它的大小回到 12字节,但这并不意味着变量的每个子变量占用 4字节的内存量。单个变量的成本并不是一个概念,它在这里有很多意义。

原作者:
...