c# - 如何在一个值中构建具有变量 1 到 4 字节的结构?

标签 c# .net

我尝试做的事情:

我想在 RAM 中存储大量数据。为了更快的访问和更少的内存占用,我需要使用一个结构值数组:

MyStruct[] myStructArray = new MyStruct[10000000000];

现在我想在 MyStruct 中存储一个、两个、三个或四个字节的无符号整数值。但它应该只使用尽可能少的内存量。当我将一个值存储一个字节时,它应该只使用一个字节等等。

我可以用类来实现它,但这在这里是不合适的,因为指向对象的指针在 64 位系统上需要 8 个字节。所以最好只为每个数组条目存储 4 个字节。但我只想在需要时存储/使用一个/两个/三个字节。所以我不能使用一些花哨的类。

我也不能使用一个包含一个字节的数组,一个包含两个字节的数组等等,因为我需要值的特殊顺序。而且这些值非常复杂,因此在切换到另一个数组时存储额外的引用也无济于事。

无论我只需要存储一个字节,大约 60% 的时间存储两个字节,大约 25% 的时间存储三个字节,是否有可能想要存储 4 字节 uint 数组的唯一方法或唯一方法?

最佳答案

这是不可能的。 CLR 将如何处理以下表达式?

myStructArray[100000]

如果元素的大小可变,CLR 无法知道第 100000 个元素的地址。因此,数组元素始终具有固定大小。

如果您不需要 O(1) 访问权限,您可以在 byte[] 之上实现可变长度元素并自行搜索数组。

您可以将列表拆分为 1000 个子列表,这些子列表单独打包。这样您就可以获得 O(n/2000) 的平均搜索性能。也许这在实践中已经足够好了。

“压缩”数组平均只能在 O(n/2) 中搜索。但是,如果您的部分数组是大小的 1/1000,它将变为 O(n/2000)。您可以在 O(1) 中选择部分数组,因为它们的大小都相同。

此外,您还可以调整部分数组的数量,使它们的大小分别约为 1k 个元素。那时数组对象的开销和对它的引用消失了。这将为您提供 O(1000/2 + 1) 查找性能,我认为这比 O(n/2) 有了很大的改进。这是一个恒定时间查找(有一个很大的常数)。

关于c# - 如何在一个值中构建具有变量 1 到 4 字节的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11378880/

相关文章:

c# - Entity Framework 7 中的多对多查询

C# 使用安全/权限设置将文件夹复制到另一个目的地

c# - 如何从单独的运行进程中捕获表单事件

c# - 处理更新详细记录的 RESTful 方式

c# - EF6 基于子子项的条件

c# - OpenFileDialog 路径问题

.net - 我可以在 Visual Studio 2008 IDE 中使用 .net framework 4

c# - 将流转换为字节串

c# - 似乎无法在 visual studio 2012 中保存数据库表

c# - WCF Web 服务调用 - 要捕获哪些异常?