このC#コードをコンパイルしてArrayTest.exeを実行すると、プロセスが数秒間ハングし、1GBのRAMが消費され、StackOverflowExceptionでクラッシュする。どうして?大きなギザギザの配列を初期化すると1GBのRAMが必要になり、StackOverflowExceptionでクラッシュする
public struct Point { }
public class ArrayTest {
public static void Main(string[] args) {
Point[][] array = {
new Point[]{new Point(), new Point(), /* ... 296 omitted ... */, new Point(), new Point()},
new Point[]{new Point(), new Point(), /* ... 296 omitted ... */, new Point(), new Point()},
/* ... 296 omitted ... */
new Point[]{new Point(), new Point(), /* ... 296 omitted ... */, new Point(), new Point()},
new Point[]{new Point(), new Point(), /* ... 296 omitted ... */, new Point(), new Point()},
};
/* Do nothing and return */
}
}
Microsoft(R).NET Framework 4.5用のMicrosoft(R)Visual C#コンパイラバージョン4.0.30319.33440を使用しています。私はコマンドラインでcsc.exeを呼び出し、コンパイルされたEXEを実行しています。この問題は、csc /optimize
フラグを追加すると消えます。上記のスニペットは、実際には私がテストしているコード全体です - 配列が初期化された後、Main()で実行される有用な作業はありません。
問題のコンテキスト:数値テストケースのセットをプログラムにハードコードしようとしました。 〜5(
class Point { int x; int y; }
Point[][] data = { // About 1000 entries
{new Point(1, 2)},
{new Point(5, 3), new Point(0, 6), new Point(1, 8)}, // Different length
... et cetera ...
};
for (Point[] thing : data):
test(thing);
をしかし、私はC#で、このようなコンパイルされたコードにしようとしたとき、配列の初期化は著しく時間を取っ:Javaのは、JavaScript、またはPythonでは、コードは無邪気に次のようになりますと、正常に動作します秒)の間、たとえtest()
のfor-loopが実行を開始することができます。
struct Point
にはフィールドが含まれておらず、Main()
には配列の初期化だけしか含まれておらず、有効な作業がない上のMVCEに実際のコードが縮小されています。
なぜdownvotes? –
私が与えたタイトルは記述的でなく、潜在的に炎症性ではないと思う。 – Nayuki
@全員:タイトルとタグを適切に編集してください。私は正直に私の問題を分類する方法を知らない – Nayuki