当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《c#中动态类型的内存使用情况》经验,为你挑选了1个好方法。

动态类型是否使用更多内存大小,而不是相关类型?

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

dynamic foo = (int) 1488;

CodingYoshi.. 7

简短回答:

不会.它实际上在32位机器上使用12个字节,在64位上使用24个字节.

答案很长

一个dynamic类型将被存储为一个对象,但在运行时,编译器会加载更多的字节,以什么与做的意义dynamic类型.为了做到这一点,将使用更多的内存来解决这个问题.把它想象dynamic成一个奇特的对象.

这是一堂课:

class Mine
{
}

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

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

由于32位上的最小参考类型是12字节,因此总共需要为其分配12个字节.

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

class Mine
{
    public int Field = 1488;
}

它仍然需要12个字节,因为开销和int字段可以适合12个字节.

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

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

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

不会是12个字节.动态字段将被视为a object,因此大小将为12 + 12 = 24字节.

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

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

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

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

这里有一些陷阱,你应该知道的,看到这个答案的大小object.



1> CodingYoshi..:

简短回答:

不会.它实际上在32位机器上使用12个字节,在64位上使用24个字节.

答案很长

一个dynamic类型将被存储为一个对象,但在运行时,编译器会加载更多的字节,以什么与做的意义dynamic类型.为了做到这一点,将使用更多的内存来解决这个问题.把它想象dynamic成一个奇特的对象.

这是一堂课:

class Mine
{
}

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

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

由于32位上的最小参考类型是12字节,因此总共需要为其分配12个字节.

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

class Mine
{
    public int Field = 1488;
}

它仍然需要12个字节,因为开销和int字段可以适合12个字节.

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

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

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

不会是12个字节.动态字段将被视为a object,因此大小将为12 + 12 = 24字节.

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

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

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

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

这里有一些陷阱,你应该知道的,看到这个答案的大小object.

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有