-1

如果我做

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;
    }
}

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

如果我想知道到底吃了多少操作内存int x = 5;,我应该只数sizeof(int)还是数sizeof(int) + IntPtr.Size

注意:我知道这Marshal.SizeOf允许您调用一些特殊函数,该函数返回非托管对象/类型的精确大小,但这对我来说似乎太慢了。我需要一种方法来获取尽可能少消耗 cpu 的对象大小,所以我宁愿只使用本机 sizeof()

4

1 回答 1

5

您问题中的所有内容都是错误的。

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

这里没有参考。

bool 等,通常是内存便宜的类型,在 c# 中是相当昂贵的内存

不,他们不是。这些类型是值类型,它们不使用引用,因此不会产生开销。此类类型的大小就是该类型本身。

但对于引用类型也是如此:包含两个引用的结构的大小等于两个引用的大小。它没有额外的那些引用后面的内存大小。

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

这并不慢。

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

是什么让您认为这Marshal.SizeOf比 慢sizeof

所以我宁愿只使用本机 sizeof()

C# 中没有“本机”之类的东西。即使有,sizeof也不比Marshal.SizeOf.

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

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

于 2013-06-07T12:27:41.267 回答