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

Memory usage of dynamic type in c#

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

例如,该字段是否只使用四个字节?

dynamic foo = (int) 1488;

简答

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

长答案

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

这是一个class:

class Mine
{
}

这是上述对象在 32 位上的开销:

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

因为32bit最小的引用类型是12字节,一共需要分配12字节。

如果我们像这样向 class 添加一个字段:

class Mine
{
    public int Field = 1488;
}

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

如果我们再添加一个int字段,它将占用16个字节。

但是,如果我们像这样向 class 添加一个 dynamic 字段:

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

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

有趣的是,如果您改为这样做:

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

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

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

Here are some gotchas you should be aware of and see this 尺寸 object.

的答案