私は独自の言語用のコンパイラを実装しています。64ビット整数に無制限の範囲があることを推測する
言語には、1つの組み込み整数型があり、無制限の範囲があります。 a
とb
が整数変数であるが、b
にしか発現a % 100000
又はa & 0xFFFFFF
の値を割り当てられている場合時々変数は、例えば、より小さなタイプを使用して表され、次いでb
代わりInt32
として表すことができます。
次の最適化の実装を検討しています。それは、このC#メソッドの同等見ていると仮定します。以下に変身、
public static void Main(string[] args)
{
BigInt i = 0;
while (true)
{
DoStuff(i++);
}
}
数学的に言えば、ない有効です。
public static void Main(string[] args)
{
Int64 i = 0;
while (true)
{
DoStuff(i++);
}
}
は私がInt64
でBigInt
を交換したので、その最終的意志ループが永遠に実行されるとオーバーフローします。
i
が0に初期化され、繰り返しているが、それは をオーバーフローさせるために、ループの2 反復を取る意味し、それに1を加えただけで修正されています。しかし、私は、私はこの可能性を無視することができます疑います
DoStuff
が役に立った場合は、i
がオーバーフローするまで何世紀もかかるでしょう(私の非常に粗いテストから外挿されます)。プログラムが実行されているマシンはそれほど長くは続かないでしょう。それだけでなく、そのアーキテクチャもおそらく長く続くことはないので、新しいハードウェアに移行されたVM上で動作することについても心配する必要はありません。DoStuff
は、任意の有用な仕事をしていない場合、オペレータは、最終的にはCPUサイクルを無駄にし、プロセス
を殺すだから私は心配する必要がを何のシナリオを行うていることがわかりますか?
既にこのハッキングを使用しているコンパイラはありますか?
BigIntのint最適化は小さいですか?もしそうなら、私はあなたの最適化がすべてエキサイティングであるとは思っていますが、それでも2回のテストは避けられますが、あなたの独自の言語に応じて、もしそうでなければ、まずBigIntコードの外に1つを適用できる狭い状況を探しに行く前に、まず最初に実装してみましょう:-) –