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
.
的答案
动态类型是否使用比相关类型更多的内存大小?
例如,该字段是否只使用四个字节?
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
.