【问题标题】:Memory usage of dynamic type in c#c#中动态类型的内存使用情况
【发布时间】:2017-05-31 21:30:21
【问题描述】:

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

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

dynamic foo = (int) 1488;

【问题讨论】:

  • 基础变量仍然是int,所以是的,值是 4 个字节。不过,程序使用动态会产生一些额外的一般开销。
  • 从根本上讲,dynamic 只是一个object,它使用了一堆花哨的反射使其表现得像一个动态类型。它不会占用比它实际表示的类型更多或更少的数据。
  • 你的答案就在这里。 (注意第一个例子,动态类型和对象类型都返回 System.Int32 类型。)msdn.microsoft.com/en-us/library/dd264741.aspx
  • @Abion47 如果它使用一堆花哨的反射来使它像一个动态类型那么它如何只使用4个字节?你确定它没有开销或任何垃圾创建吗?你有参考吗?
  • @M.kazemAkhgary 与普通Int32 使用反射的方式相同,因为dynamic 确实如此......

标签: c# sizeof dynamictype


【解决方案1】:

简答

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

长答案

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

这是一个类:

class Mine
{
}

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

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

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

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

class Mine
{
    public int Field = 1488;
}

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

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

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

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

它将为 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 的大小。

【讨论】:

    猜你喜欢
    • 2010-10-19
    • 2015-12-08
    • 1970-01-01
    • 2011-01-21
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多