Dコンパイラでは、「final switch
」構成がD内に普通のswitch
以上の何らかの最適化の可能性を持っていますか? (DLangは)Dスイッチの最適化の可能性(DLang)
答えて
final switch
ドキュメントに目を向ける:http://dlang.org/spec/statement.html#FinalSwitchStatementそれだけで(それがコードにラベルを設定し、ちょうど後藤は、変数の値に基づかようなものを使用する必要があります)Cでswitch
と同じ最適化が可能です。 Dのswitch
はCの中でswitch
よりも一般的であり、そのような最適化を許可しません。 Dからのスイッチは、ランタイム初期化の大文字と小文字の値を使用できます。
短い回答:なし。
長い答え: switch
以上final switch
の主な利点は、あなたが列挙型の値でそれを使用するとき、それはあなたが列挙型のメンバーの一人欠けているエラーを与えるということですので、あなたのことができそれらをすべてカバーしていることを確認してください。列挙型が変更されてメンバー数が増えた場合は、switch
ステートメントを更新する必要があることがわかります。それとは別に
final switch
はかなり
assert(0)
を持って
default
場合と
switch
文と同じものである - それはそれは
0
を主張するのではなく、
SwitchError
をスローすることだけです。この効果は本質的に同じですが、
switch
ステートメントにいずれのケースでもカバーされていない値が与えられたときにプログラムが終了します。
final switch
を列挙型以外のものと使用することが実際に考えられる唯一の理由は、case
ステートメントがすべての可能なケースをカバーすると仮定すると、default
ケースを記述する必要がないためです。少なくとも、ある程度の時間を考えれば、SwitchError
(No appropriate switch clause found
)よりも有意義なメッセージを提供することができます。具体的にdefault
の場合はassert(0)
の方がよいと主張する傾向がありますswitch
ステートメントが列挙型で動作していないときにfinal switch
を使用するよりも、
今、最適化に関するご質問については、final switch
には、通常のswitch
以上の最適化がある可能性はありません。 final switch
にcase
ステートメントのいずれにも該当しない値が与えられたときにSwitchError
を投げるには、final switch
を通常のswitch
ステートメントに、default
のケースでSwitchError
をスローして低くする必要があります。
だから、結果のコードの面で、final switch
はswitch
声明と同様のボートにある、本当にfinal switch
とSwitchError
、および最適化ワイズをスロー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以外のものを受け入れていることに驚きました。
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
- 1. D conster consting(DLang)
- 2. C#null可能なチェックの最適化
- 3. バイトコードシーケンスの最適化が可能
- 4. テールコール最適化とRAII共存可能?
- 5. rxjs/angular4観測可能な最適化
- 6. dlang C++からMagick ++クラスをD
- 7. エースエディタの最適化機能の最適化
- 8. PHPの最適化機能
- 9. ストリームベースのウェブサイト - memcacheによる最適化のオプション(d)
- 10. JavaScriptコードの最適化 - 再利用可能なクラスの作成
- 11. 空のデータメンバーの最適化:可能でしょうか?
- 12. 浮動小数点コード用のg ++最適化スイッチ
- 13. Dの最適化レベルは何ですか?
- 14. Androidの最適化と移植性
- 15. クヌース最適化の単調性
- 16. Python可視化最適化パラメータ
- 17. D/DLang:モジュールプライベートのインライン関数のコード生成を禁止する
- 18. SQLの日付の最適化機能
- 19. SQL最適化最適化?
- 20. gem内のバイナリ実行可能ファイルのベンダー化可能性?
- 21. GCCコンパイラ最適化機能インライン化
- 22. をオンとオフを切り替え可能な最適化
- 23. cythonで可能な最適化:numpy配列
- 24. 実行可能なサイズを最適化できますか?
- 25. コードフラグメントを最適化することは可能ですか?
- 26. Java 8オプション/機能コードの最適化
- 27. 最適化PHP MySQLのカウント機能
- 28. Androidでスイッチ表示可能
- 29. SQLトランザクションのシリアル化可能性
- 30. Java enumsの可用性の可能性と可能性?
私はDをCとよく比較するつもりはありませんでしたが、それは良い点ですが、コード生成の点でDの 'final switch'と' switch'文の最適化の可能性を比較しようとしました。 。 (元の記事は後で明確にするために編集されました) –
Dの 'switch 'と' switch'をCの 'switch 'と比較しました.Dの' switch'は実行時初期化の値を使うことができるので、実装できませんvia labels/goto。 –
私は、GDCは、「スイッチ」のDコードがCよりも一般的ではないときに可能なすべての最適化を発見するのに十分なインテリジェントであると信じています。たとえば、多数の密な定数がある場合、表。しかし、 –