c#中的sizeof()仅返回类型本身的大小,或者它也会计算引用大小

时间:2013-06-07 11:44:42

标签: c# memory

如果我这样做

class x
{
    int a; // here we have 2 integers, each reference has 4 bytes itself
    int b;
    public int GetSize()
    {
        // this function is supposed to return size of the class in operating memory in bytes
        return sizeof(int) * 2;
        // OR should it be this?
        return sizeof(int) * 2 + IntPtr.Size * 2;
    }
}

如果我在某种类型上调用sizeof,例如int或double,它会返回该值使用的ram的多少?或者它也计算引用本身的大小。我知道c#中的每个引用都至少占用4个字节(因此bool等通常是内存便宜的类型,在c#中的内存非常昂贵)。

如果我想知道int x = 5;吃了多少操作记忆,我应该只计算sizeof(int)sizeof(int) + IntPtr.Size

注意:我知道Marshal.SizeOf允许你调用一些特殊的函数来返回非托管对象/类型的精确大小,但这对我来说似乎太慢了。我需要一种方法来获得尽可能少吃cpu的对象大小,所以我更喜欢使用原生sizeof()

1 个答案:

答案 0 :(得分:6)

你问题中的一切都是错误的。

  

或者它也会计算引用本身的大小。

这里没有参考。

  bopo等,通常是内存便宜的类型,在c#

中的内存非常昂贵

不,他们不是。这些类型是值类型,它们不使用引用,因此不会产生任何开销。这种类型的大小就是那种类型。

但对于引用类型也是如此:包含两个引用的结构的大小与两个引用的大小相同。它还具有这些引用后面的内存大小。

  

注意:我知道Marshal.SizeOf允许你调用一些特殊的函数来返回非托管对象/类型的精确大小,但这对我来说似乎太慢了。

这不慢。

  

我需要一种方法来获得尽可能少吃cpu的对象大小

是什么让您认为Marshal.SizeOfsizeof慢?

  

所以我更愿意使用原生sizeof()

在C#中没有“本机”这样的东西。即使有,sizeof并不比Marshal.SizeOf更原生。

无论如何,在所有类成员上使用sizeof并添加其大小是错误的,因为它忽略了padding(这在您的特定示例中不是问题,但通常是这样)。

除了上述所有内容之外,您的方法无论如何都可能是错误的。为什么你需要知道类型的大小?有可能你无法做任何有意义的事情。特别是,Marshal.SizeOf仅对非托管类型有意义,因为它的唯一目的是确定必须通过Marshal.AllocHGlobal分配多少内存。