繁体   English   中英

将数据存储在C#可执行文件中并防止它被复制到堆中

[英]Storing data inside of a C# executable and preventing it getting copied to the heap

我想在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

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

不要在源代码中声明它,而是使用嵌入式资源文件,并使用Assembly.GetManifestResourceStream从中读取。 鉴于你对Damien的答案的评论,这可能仍然不是你想要的。 你可能想要使用内存映射文件......很难确切知道。

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

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

你提出了对数组内容被改变的关注 - 但如果你没有暴露一种写作方式,而你自己不修改它,你应该没问题。 究竟关心什么? 感觉就像你没有告诉我们这里有很多背景。

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

你是否真的担心4k空间被浪费了?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM