0

事前に計算されたデータをC#プログラムに埋め込みたい。私の現在のアプローチは、次のようにデータを配列に単純に格納することです。

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

私の問題は次のとおりです。someDataに4kBの情報が含まれているとします。この4kBは実行可能ファイル内に格納され、メモリを消費します。ただし、配列の初期化が実行されると、データはヒープにコピーされ、必要なスペースが2倍になります。この配列に書き込むことは決してないので、これは無駄です。したがって、プログラムバイナリから直接必要なデータを取得することもできます。

配列を読み取り専用フィールドとして宣言しても役に立ちません。これにより、配列ポインターが読み取り専用になり、データのコピー(または配列への書き込み)が妨げられることはありません。配列をconstとして宣言することはできません。

コピーを防ぎ、プログラムバイナリから直接データにアクセスする方法はありますか?

これは、プログラムを何千回も実行してテストするプログラミングコンテスト用です(その数のプロセスを作成することによって、私のプログラムには多くのテストケースを含むきちんとしたファイルが与えられず、ケースごとに1回実行されます)。配列の内容をプログラム実行可能ファイルからヒープにコピーする必要があるため、配列の初期化には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。ダミアンの答えに対するあなたのコメントを考えると、これはまだあなたが探しているものではないかもしれません。代わりにメモリマップトファイルを使用することをお勧めします...確実に知るのは難しいです。

または、読み取り専用変数を使用する可能性について話します。これも静的である可能性があります。

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

配列の内容が変更されるという懸念が生じますが、配列への書き込み方法を公開せず、自分で変更しない場合は、問題ないはずです。何を心配していますかあなたが私たちに言っていない文脈がここにたくさんあるように感じます。

于 2012-04-29T08:56:42.800 に答える
0

いいえ。プログラムの実行可能ファイルにオブジェクトのインスタンスを格納する方法はありません。このデータにとしてアクセスするには、その配列オブジェクトを作成する必要があります。また、そのオブジェクトはヒープの1つに構築する必要があります(またはスタックに配置する必要がありますが、この使用法には適していません)。int[]

4kのスペースが無駄になることを本当に心配していますか?

于 2012-04-29T08:52:21.420 に答える