c#中动态类型的内存使用情况

时间:2017-01-16 23:24:00

标签: c# sizeof dynamictype

动态类型是否比相关类型使用更多的内存大小?

例如,该字段仅使用四个字节吗?

dynamic foo = (int) 1488;

1 个答案:

答案 0 :(得分:7)

简短回答

没有。它实际上在32位机器上使用12个字节,在64位上使用24个字节。

长答案

dynamic类型将存储为对象,但在运行时,编译器将加载更多字节以了解如何处理dynamic类型。为了做到这一点,将使用更多的内存来解决这个问题。将dynamic视为花哨的对象。

这是一个班级:

class Mine
{
}

以下是32bit上面对象的开销:

--------------------------  -4 bytes 
|  Object Header Word    |
|------------------------|  +0 bytes
|  Method Table Pointer  |
|------------------------|  +4 bytes for Method Table Pointer

总共需要分配12个字节,因为32位上的最小引用类型是12个字节。

如果我们像这样在该类中添加一个字段:

class Mine
{
    public int Field = 1488;
}

它仍然需要12个字节,因为开销和int字段可以容纳12个字节。

如果我们添加另一个int字段,则需要16个字节。

但是,如果我们向该类添加一个dynamic字段,如下所示:

class Mine
{
    public dynamic Field = (int)1488;
}

NOT 为12个字节。动态字段将被视为object,因此大小将为12 + 12 = 24字节。

有趣的是,如果你这样做:

class Mine
{
    public dynamic Field = (bool)false;
}

Mine的实例仍将占用24个字节,因为即使动态字段只是布尔值,它仍然被视为object

在64位机器上,具有动态的Mine实例将占用48个字节,因为64位上的最小引用类型是24个字节(24 + 24 = 48个字节)。

Here是您应该注意的一些陷阱,请参阅this答案,了解object的大小。