[過去ログ]
Rust part15 (1002レス)
Rust part15 http://mevius.5ch.net/test/read.cgi/tech/1652347700/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
レス栞
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
リロード規制
です。10分ほどで解除するので、
他のブラウザ
へ避難してください。
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
620: デフォルトの名無しさん [sage] 2022/06/12(日) 20:59:35.22 ID:nrxswUhC 実際に >>618のOverflowingAddAssignを用いてLendingIteratorで実装すると 以下のようになり、GATsを用いている以外は現状のIteratorともちろん同じ形 自己参照を返せるようになった点のみ異なる impl<T: OverflowingAddAssign> LendingIterator for Fibonacci<T> { type Item<'a> = &'a T where Self: 'a; fn next<'a>(&'a mut self) -> Option<Self::Item<'a>> { if self.is_overflow { return None; } if self.is_first { self.is_first = false; } else { self.is_overflow = self.p.overflowing_add_assign(&self.q); std::mem::swap(&mut self.p, &mut self.q); } Some(&self.p) } } is_first処理は >>511のコードでの「iter::once(p.clone()).chain(...」部分であり必須 また、前述のようにBigUintで用いれば is_overflow が常にfalseのため最適化で消えて、 値の更新部分は「self.p += &self.q」のみが残り非ジェネリックと同一コードとなる したがって、上述のコードがどの型でも最善に動作するコードとなるだろう http://mevius.5ch.net/test/read.cgi/tech/1652347700/620
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
635: デフォルトの名無しさん [sage] 2022/06/13(月) 00:50:16.18 ID:WmCB7dh7 >>633 意味不明 Some(())/Noneにするならば>>618のbool値のコードで十分 http://mevius.5ch.net/test/read.cgi/tech/1652347700/635
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.037s