动态类型是否比相关类型使用更多的内存大小?
例如,该字段仅使用四个字节吗?
dynamic foo = (int) 1488;
答案 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个字节)。