2016-08-24 9 views

答えて

1

final switchドキュメントに目を向ける:http://dlang.org/spec/statement.html#FinalSwitchStatementそれだけで(それがコードにラベルを設定し、ちょうど後藤は、変数の値に基づかようなものを使用する必要があります)Cでswitchと同じ最適化が可能です。 DのswitchはCの中でswitchよりも一般的であり、そのような最適化を許可しません。 Dからのスイッチは、ランタイム初期化の大文字と小文字の値を使用できます。

+0

私はDをCとよく比較するつもりはありませんでしたが、それは良い点ですが、コード生成の点でDの 'final switch'と' switch'文の最適化の可能性を比較しようとしました。 。 (元の記事は後で明確にするために編集されました) –

+0

Dの 'switch 'と' switch'をCの 'switch 'と比較しました.Dの' switch'は実行時初期化の値を使うことができるので、実装できませんvia labels/goto。 –

+0

私は、GDCは、「スイッチ」のDコードがCよりも一般的ではないときに可能なすべての最適化を発見するのに十分なインテリジェントであると信じています。たとえば、多数の密な定数がある場合、表。しかし、 –

6

短い回答:なし。

長い答え: switch以上final switchの主な利点は、あなたが列挙型の値でそれを使用するとき、それはあなたが列挙型のメンバーの一人欠けているエラーを与えるということですので、あなたのことができそれらをすべてカバーしていることを確認してください。列挙型が変更されてメンバー数が増えた場合は、switchステートメントを更新する必要があることがわかります。それとは別に

は、意味的に、 final switchはかなり assert(0)を持って default場合と switch文と同じものである - それはそれは 0を主張するのではなく、 SwitchErrorをスローすることだけです。この効果は本質的に同じですが、 switchステートメントにいずれのケースでもカバーされていない値が与えられたときにプログラムが終了します。

final switchを列挙型以外のものと使用することが実際に考えられる唯一の理由は、caseステートメントがすべての可能なケースをカバーすると仮定すると、defaultケースを記述する必要がないためです。少なくとも、ある程度の時間を考えれば、SwitchErrorNo appropriate switch clause found)よりも有意義なメッセージを提供することができます。具体的にdefaultの場合はassert(0)の方がよいと主張する傾向がありますswitchステートメントが列挙型で動作していないときにfinal switchを使用するよりも、

今、最適化に関するご質問については、final switchには、通常のswitch以上の最適化がある可能性はありません。 final switchcaseステートメントのいずれにも該当しない値が与えられたときにSwitchErrorを投げるには、final switchを通常のswitchステートメントに、defaultのケースでSwitchErrorをスローして低くする必要があります。

だから、結果のコードの面で、final switchswitch声明と同様のボートにある、本当にfinal switchSwitchError、および最適化ワイズをスローdefault場合があり、通常のswitch間に違いありません0をアサートdefault場合(プログラムErrorをキャッチすることができ、一方、コンパイラは、アサーションが明示的にfalseあるときに、プログラムが死ぬだろうと仮定することができますのでassert(0)は、おそらくSwitchErrorを投げるよりも、最適化につながる可能性が高いですが、とたとえそうであってはならない場合でも続行する)。

defaultケースがプログラムにヒットした場合にそのプログラムが強制終了するという保証に基づいて、コンパイラが最適化を実行できるかどうかはわかりません。可能であれば、final switchを使用して得られる最適化があるかもしれませんが、0がアサートされたdefaultの正規のswitchまたはErrorが投げられたものはfinal switchと同じボートになります。だから、その点に関してはfinal switchについては何も魔法はありません。 final switchの魔法はenumでバグを捕まえています。

実際には、値が固定された列挙型を扱うときにのみfinal switchを使用することをお勧めします。そうすれば、ケースが列挙型メンバーと一致しないときやそれ以外あなたはちょうどfinal switchを使わないでください。正直なところ、私はfinal switchがenums以外のものを受け入れていることに驚きました。

+0

SwitchErrorはリリースモードではスローされません(ここではそれに関する議論があります:https://issues.dlang.org/show_bug.cgi?id=11051)。チェックがなければ、いくつかの最適化が可能です。たとえば、https://gcc.gnu.org/bugzilla/show_bug.cgi?id=49054およびhttps://gcc.gnu.org/bugzilla/show_bug.cgi?id=51513を参照してください。 – jpf

関連する問題