动态类型是否使用更多内存大小,而不是相关类型?
例如,该字段仅使用四个字节吗?
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
.
简短回答:
不会.它实际上在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
.