gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:38:23 26 4
gpt4 key购买 nike

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

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

dynamic foo = (int) 1488;

最佳答案

简答:

没有。它实际上在 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

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

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

class Mine
{
public int Field = 1488;
}

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

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

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

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

不是是 12 个字节。动态字段将被视为对象,因此大小将为 12 + 12 = 24 字节。

有趣的是,如果您改为这样做:

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

Mine 的实例仍然需要 24 个字节,因为即使动态字段只是一个 bool 值,它仍然被视为一个 对象

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

Here有一些您应该注意的陷阱并查看this回答对象的大小。

关于c# - c#中动态类型的内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41686630/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com