gpt4 book ai didi

c# - 结构与类的内存开销

转载 作者:行者123 更新时间:2023-12-02 20:35:30 25 4
gpt4 key购买 nike

我正在编写一个应用程序,它将创建数千个小对象并将它们递归地存储在数组中。我所说的“递归”是指 K 的每个实例都会有一个 K 实例数组,该数组将有一个 K 实例数组,依此类推,这个数组 + 一个 int 字段是唯一的属性 + 一些方法。我发现即使是少量数据(大约 1MB),内存使用量也会增长得非常快,当我正在处理的数据大约为 10MB 时,我会得到“OutOfMemoryException”,更不用说当它更大时(我有 4GB RAM) :)。那么你建议我做什么?我想,如果我创建单独的类 V 来处理这些对象,那么 K 的实例将只有 K 的数组 + 一个整数字段,并使 K 成为一个结构体,而不是一个类,它应该稍微优化一下 -没有垃圾收集之类的东西...但这有点挑战,所以在我开始完全重写之前我宁愿问你这是否是一个好主意:)。

编辑:好的,一些抽象代码

public void Add(string word) {
int i;
string shorter;

if (word.Length > 0) {
i = //something, it's really irrelevant

if (t[i] == null) {
t[i] = new MyClass();
}

shorterWord = word.Substring(1);

//end of word
if(shorterWord.Length == 0) {
t[i].WordEnd = END;
}

//saving the word letter by letter
t[i].Add(shorterWord);
}
}
}

最佳答案

对我来说,在深入研究这个问题时,我已经有了以下假设(它们可能不准确;对于程序员来说,我已经老了)。类会消耗额外的内存,因为需要引用来寻址它。存储引用,32 位编译需要一个 Int32 大小的指针。总是分配在堆上(不记得 C++ 是否还有其他可能性,我敢说是吗?)

简短的回答,在本文中找到,对象有 12 个字节的基本占用空间 + 4 个可能未使用的字节,具体取决于您的类(毫无疑问与填充有关)。

http://www.codeproject.com/Articles/231120/Reducing-memory-footprint-and-object-instance-size

您会遇到的其他问题是数组也有开销。一种可能性是将您自己的偏移量管理到一个或多个更大的数组中。这反过来又更接近更高效的语言更适合的东西。

我不确定是否有库可以有效地为小对象提供存储。可能是。

我的看法是,使用结构体,在大数组中管理自己的偏移量,并使用适当的打包指令(如果它对您有用的话)(尽管我怀疑这会在每次寻址不均匀时在运行时花费一些额外的指令)打包数据)

[StructLayout(LayoutKind.Sequential, Pack = 1)]

关于c# - 结构与类的内存开销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9212216/

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