[過去ログ]
Rust part15 (1002レス)
Rust part15 http://mevius.5ch.net/test/read.cgi/tech/1652347700/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
リロード規制
です。10分ほどで解除するので、
他のブラウザ
へ避難してください。
566: デフォルトの名無しさん [sage] 2022/06/08(水) 21:31:30.99 ID:uKz/tAPi >>560 CheckedAddAssignはAddAssignと同じようには実現できないよ 速度差は他の方法で工夫すれば埋めることは不可能ではない http://mevius.5ch.net/test/read.cgi/tech/1652347700/566
618: デフォルトの名無しさん [sage] 2022/06/12(日) 20:36:02.36 ID:nrxswUhC >>562 >>566 CheckedAddAssignにこだわる必要はないため、発想を転換して、 checked_add()の原関数であるoverflowing_add()を用いることで、 overflowing_add_assign()を用意して同じようにbool値を返せば解決する 具体的には以下のように引数はadd_assign()と同じでbool値を返せばよい trait OverflowingAddAssign { fn overflowing_add_assign(&mut self, rhs: &Self) -> bool; } オーバーフローするi8型〜u128型にはoverflowing_add()があるため実装はこうなる let is_overflow; (*self, is_overflow) = self.overflowing_add(*rhs); is_overflow この3行のコードでちゃんと最適化されるかどうかを確認するため、 単純にadd_assignを用いた場合、すなわち「*self += rhs」と比較すると https://godbolt.org/z/WP3En8xM8 のアセンブリ出力となり、オーバーフローを返す以外は同一に最適化されることが確認できる 一方でオーバーフローしないBigUintなどの型への実装はこうなる *self += rhs; false つまりオーバーフローの結果として常にfalseを返すので、 こちらは使う側でオーバーフローの扱いが消えてadd_assign部分のみに最適化される したがってこのOverflowingAddAssignを用いてジェネリックに書けば、 どちらの型の場合であっても、非ジェネリックに書いた時と同一コードとなる http://mevius.5ch.net/test/read.cgi/tech/1652347700/618
627: デフォルトの名無しさん [sage] 2022/06/12(日) 22:59:17.60 ID:MphJhZqp >>618 それが>>566の2行目で書いてる工夫のことだよ boolではなくchecked_add使ってOption<()>返すメソッドにしておけば?演算子でシンプルに書ける http://mevius.5ch.net/test/read.cgi/tech/1652347700/627
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.040s