如果我这样做
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()
答案 0 :(得分:6)
你问题中的一切都是错误的。
或者它也会计算引用本身的大小。
这里没有参考。
bopo等,通常是内存便宜的类型,在c#中的内存非常昂贵
不,他们不是。这些类型是值类型,它们不使用引用,因此不会产生任何开销。这种类型的大小就是那种类型。
但对于引用类型也是如此:包含两个引用的结构的大小与两个引用的大小相同。它不还具有这些引用后面的内存大小。
注意:我知道Marshal.SizeOf允许你调用一些特殊的函数来返回非托管对象/类型的精确大小,但这对我来说似乎太慢了。
这不慢。
我需要一种方法来获得尽可能少吃cpu的对象大小
是什么让您认为Marshal.SizeOf
比sizeof
慢?
所以我更愿意使用原生sizeof()
在C#中没有“本机”这样的东西。即使有,sizeof
并不比Marshal.SizeOf
更原生。
无论如何,在所有类成员上使用sizeof
并添加其大小是错误的,因为它忽略了padding(这在您的特定示例中不是问题,但通常是这样)。
除了上述所有内容之外,您的方法无论如何都可能是错误的。为什么你需要知道类型的大小?有可能你无法做任何有意义的事情。特别是,Marshal.SizeOf
仅对非托管类型有意义,因为它的唯一目的是确定必须通过Marshal.AllocHGlobal
分配多少内存。