gpt4 book ai didi

c# - 我的对象会被放置在大对象堆中吗?

转载 作者:行者123 更新时间:2023-11-30 21:11:43 24 4
gpt4 key购买 nike

当 CLR 将一个对象放在大对象堆上时,它是一个“全有还是全无”的交易?类/结构成员是否“拆分”并放置在不同的堆中?

class OneBigObject
{
byte[] bigObject;

public OneBigObject()
{
bigObject = new byte[100000];
}
}

class TwoSmallObjects
{
byte[] smallObject1;
byte[] smallObject2;

public TwoSmallObjects()
{
smallObject1 = new byte[50000];
smallObject2 = new byte[50000];
}
}

class MixedSizeObjects
{
byte[] smallObject1;
byte[] smallObject2;
byte[] bigObject;

public MixedSizeObjects()
{
smallObject1 = new byte[50000];
smallObject2 = new byte[50000];
bigObject = new byte[100000];
}
}

OneBigObject oneBigObject = new OneBigObject();
TwoSmallObjects twoObjects = new TwoSmallObjects();
MixedSizeObjects mixedSizeObjects = new MixedSizeObjects();

TwoSmallObjects 是否放置在大对象堆中,因为它的总大小超过 85,000 字节?即使两个成员都在阈值之下? MixedSizeObjects 怎么样?

最佳答案

您分配的每个字节数组都与封闭类分开处理。所以 OneBigObject 实际上是两个不同的 CLR 对象。一个是 OneBigObject 实例,它非常小并且只包含一个引用字段。另一个是 100,000 个实例的实际字节数组。同样的原则也适用于其他类。

类和结构没有分开。没有必要,因为很难想象有人会创建一个具有足够实际字段以使其存储大小达到 85k 的类型。看起来很大的对象,就像您的示例一样,实际上由引用和引用数组组成,因此根本不是很大。

关于c# - 我的对象会被放置在大对象堆中吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7883696/

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