0

我想在 C# 程序中嵌入一些预先计算的数据。我目前的方法是将数据简单地存储在一个数组中,如下所示:

int[] someData = new int[] { 1, 2, 3, 4 };

我的问题如下:说 someData 包含 4kB 的信息。这 4kB 存储在可执行文件中并占用内存。但是,一旦执行了数组初始化,数据就会被复制到堆中——所需的空间增加了一倍。这是一种浪费,因为我永远不会写入这个数组,所以我也可以直接从程序二进制文件中获取我想要的数据。

将数组声明为只读字段无济于事:这只会使数组指针只读,并且不会阻止数据的复制(或写入数组,就此而言)。您不能将数组声明为 const。

有什么方法可以防止复制并直接从程序二进制文件中访问数据?

这是一个编程竞赛,程序通过运行数千次来测试(通过创建那么多进程——我的程序没有得到一个包含许多测试用例的整洁文件,它为每个用例执行一次)。数组初始化占用了 90% 的时间,因为数组的内容必须从可执行程序复制到堆中。这似乎是在浪费时间,所以我想找到一种方法来避免复制并直接从程序二进制文件中读取数据。我想要完成的最好是这样表示(在伪汇编程序中):

jump to location 1002
...1000 words of data...
do a binary search on data from location 2 to 1001
4

2 回答 2

2

有什么方法可以防止复制并直接从程序二进制文件中访问数据?

不要在源代码中声明它,而是使用嵌入式资源文件,并使用Assembly.GetManifestResourceStream. 鉴于您对 Damien 的回答的评论,这可能仍然不是您想要的。您可能想改用内存映射文件......很难确定。

或者,您谈论使用只读变量的可能性 - 听起来它也可能是静态的:

private static readonly int[] Data = { ... };

您提出了数组内容被更改的担忧 - 但如果您不公开写入它的方式,并且您不自己修改它,那么您应该没问题。你具体关心什么?感觉这里有很多你没有告诉我们的背景。

于 2012-04-29T08:56:42.800 回答
0

不,没有办法将对象的实例存储在程序可执行文件中。为了让您以 的形式访问此数据,必须构造该数组对象。并且该对象必须在其中一个堆上构造(或放置在堆栈上,但不适合这种用法)。int[]

您真的担心浪费 4k 空间吗?

于 2012-04-29T08:52:21.420 回答