1 名前:デフォルトの名無しさん mailto:sage [2022/05/12(木) 18:28:20.99 ID:cuIcFT6k.net] 公式 https://www.rust-lang.org/ https://blog.rust-lang.org/ https://github.com/rust-lang/rust Web上の実行環境 https://play.rust-lang.org 日本語の情報 https://rust-jp.rs/ ※Rustを学びたい人はまず最初に公式のThe Bookを読むこと https://doc.rust-lang.org/book/ ※Rustを学ぶ際に犯しがちな12の過ち https://dystroy.org/blog/how-not-to-learn-rust ※Rustのasyncについて知りたければ「async-book」は必読 https://rust-lang.github.io/async-book/ ※C++との比較は専用スレへ C++ vs Rust https://mevius.5ch.net/test/read.cgi/tech/1619219089/ ※次スレは原則>>980 が立てること 前スレ Rust part14 https://mevius.5ch.net/test/read.cgi/tech/1644596656/
2 名前:デフォルトの名無しさん mailto:sage [2022/05/12(木) 18:30:00.00 ID:cuIcFT6k.net] Rust The Book (日本語版) https://doc.rust-jp.rs/book-ja/ Rust edition guide (日本語版) https://doc.rust-jp.rs/edition-guide/ Rust by example (日本語版) https://doc.rust-jp.rs/rust-by-example-ja/ Rust cookbook (日本語版) https://uma0317.github.io/rust-cookbook-ja/ Rust API guideline (日本語版) https://sinkuu.github.io/api-guidelines/ Rust nomicon book (日本語版) https://doc.rust-jp.rs/rust-nomicon-ja/ Rust WASM book (日本語版) https://moshg.github.io/rustwasm-book-ja/ Rust embeded book (日本語版) https://tomoyuki-nakabayashi.github.io/book/ Rust enbeded discovery (日本語版) https://tomoyuki-nakabayashi.github.io/discovery/
3 名前:デフォルトの名無しさん mailto:sage [2022/05/12(木) 18:30:13.50 ID:cuIcFT6k.net] Rust CLI (Command Line Interface) apps Book https://rust-cli.github.io/book/ Rust async-std Book https://book.async.rs/ Rust The Unstable Book https://doc.rust-lang.org/nightly/unstable-book/ Rust rustc Book https://doc.rust-lang.org/rustc/ Rust Cargo Book https://doc.rust-lang.org/cargo/ The Rust Reference https://doc.rust-lang.org/reference/ The Rust Standard Library https://doc.rust-lang.org/std/
4 名前:デフォルトの名無しさん mailto:sage [2022/05/12(木) 18:33:42.89 ID:q5adbU17.net] c++スレやHaskelスレでああでもないこうでもないと実用性無視してごちゃごちゃ言ってたのがRustスレに移って来て ああでもないこうでもないと不毛な話を繰り返してるだけなんだろうな…
5 名前:デフォルトの名無しさん mailto:sage [2022/05/12(木) 21:06:22.42 ID:EFEW+xd3.net] let mut >>1 乙
6 名前:デフォルトの名無しさん [2022/05/12(木) 23:07:25.38 ID:13HXXMDq.net] ごちゃごちゃ戻り値の型さえ理解してないで書いてる
7 名前:デフォルトの名無しさん mailto:sage [2022/05/13(金) 01:13:09.90 ID:ufl1G9JB.net] またワッチョイなしですか
8 名前:デフォルトの名無しさん mailto:sage [2022/05/13(金) 04:12:30.14 ID:7BsdLj8J.net] >>6 ちゃんと理解しましょう
9 名前:デフォルトの名無しさん mailto:sage [2022/05/13(金) 06:02:56 ID:6rmlfzdI.net] 乙 もっとRustが普及しますように☆彡
10 名前:デフォルトの名無しさん mailto:sage [2022/05/13(金) 18:17:33.08 ID:9chxx07M.net] >>7 ワッチョイなんて飾りです
11 名前:デフォルトの名無しさん mailto:sage [2022/05/13(金) 21:57:27.44 ID:bn7J0pQ3.net] >>7 ワッチョイスレはすでにあるだろ
12 名前:デフォルトの名無しさん mailto:age [2022/05/13(金) 22:24:15.76 ID:UR4E+9N6.net] >>8 正直言うと、俺たちは若い奴らが何やらワイワイさわいでCOBOLおじさんJAVAおじさん、C#おじさん扱いされないよう カッコよさげだから、なんとなく雰囲気でRustを書いてるんだ。 でも、うまく言えないけど理解する必要性を全く感じない、下請けにおまえRustも分らんの?とマウントするのが夢なんだ とやかく言われる筋合いは無い
13 名前:デフォルトの名無しさん mailto:sage [2022/05/13(金) 23:48:07.30 ID:uiqUB4xh.net] 再帰的なmacroはaliasしても展開時に 元の名前のマクロを使おうとしてエラーになるんだがこれって避けられない? use foo_crate::foo as bar; bar!(…) cannot find macro `foo` in this scope this error originates in the macro `bar`
14 名前:デフォルトの名無しさん mailto:sage [2022/05/14(土) 00:13:13.84 ID:BgvoYA7m.net] >>13 foo! の定義中の foo! 呼び出しを $crate::foo!() みたいにすればいけるんじゃないかな
15 名前:デフォルトの名無しさん mailto:sage [2022/05/14(土) 03:12:50.47 ID:J3IrN4Ey.net] >>14 それだ、ありがとう
16 名前:デフォルトの名無しさん [2022/05/14(土) 23:50:01.31 ID:7gZW+FH0.net] 前スレで出ていたこの上限チェックRangeFromだけど fn countup<T>(start: T) -> impl Iterator<Item=T> where T: Clone + TryFrom<usize> + num::CheckedAdd, { let one = T::try_from(1).ok().unwrap(); itertools::unfold((start, true), move |(n, is_first)| { if *is_first { *is_first = false; Some(n.clone()) } else { n.checked_add(&one) .map(|new| { *n = new.clone(); new }) } }) } フラグ持たずにOptionで持ったほうがわかりやすくない? fn countup<T>(start: T) -> impl Iterator<Item=T> where T: Clone + TryFrom<usize> + num::CheckedAdd, { let one = T::try_from(1).ok().unwrap(); itertools::unfold(Some(start), move |n| { let ret = n.clone(); if let &mut Some(ref m) = n { *n = m.checked_add(&one); } ret }) }
17 名前:デフォルトの名無しさん mailto:sage [2022/05/15(日) 00:14:36.59 ID:AindqZB4.net] 複オジに毒されてるな successors(Some(start), move |n| n.checked_add(&one))
18 名前:デフォルトの名無しさん mailto:sage [2022/05/15(日) 02:25:52 ID:/oKjcqbB.net] >>16 そのclone()は不要 トレイト境界からCloneを外せる fn countup<T>(start: T) -> impl Iterator<Item=T> where T: TryFrom<usize> + num::CheckedAdd, { let one = T::try_from(1).ok().unwrap(); itertools::unfold(Some(start), move |n| { if let &mut Some(ref m) = n { let mut next = m.checked_add(&one); std::mem::swap(n, &mut next); next } else { None } }) }
19 名前:デフォルトの名無しさん mailto:sage [2022/05/15(日) 03:11:19.26 ID:gyw6bZ1I.net] unfoldでなんでもできるからunfoldしか使わなくなってしまった人 いろいろな人
20 名前:デフォルトの名無しさん mailto:sage [2022/05/15(日) 07:53:49.50 ID:SgXGf86o.net] >>18 take()?でもっと簡潔に書ける fn countup<T>(start: T) -> impl Iterator<Item=T> where T: TryFrom<usize> + num::CheckedAdd, { let one = T::try_from(1).ok().unwrap(); itertools::unfold(Some(start), move |n| { let cur = n.take()?; *n = cur.checked_add(&one); Some(cur) }) }
21 名前:デフォルトの名無しさん mailto:sage [2022/05/15(日) 08:07:10.15 ID:SgXGf86o.net] >>19 unfoldは要点に絞って見やすい短縮記法として使われている そのままunfoldを使わずに普通に構造体にimpl Iteratorする形へ置き換え可能なところがメリット 例えば>>20 はそのまま機械的に以下へ展開できて同じく動作する struct Countup<T> { one: T, n: Option<T>, } fn countup<T>(start: T) -> impl Iterator<Item=T> where T: TryFrom<usize> + num::CheckedAdd, { Countup { one: T::try_from(1).ok().unwrap(), n: Some(start), } } impl<T> Iterator for Countup<T> where T: num::CheckedAdd, { type Item = T; fn next(&mut self) -> Option<T> { let cur = self.n.take()?; self.n = cur.checked_add(&self.one); Some(cur) } } これだと長く冗長なので敢えてunfold利用版を記述することで要点のみに絞ることができる
22 名前:デフォルトの名無しさん mailto:sage [2022/05/15(日) 10:14:06.42 ID:2aUGzSw0.net] >>19 全部同じやつだぞ 一人二役で会話してる
23 名前:デフォルトの名無しさん mailto:sage [2022/05/15(日) 10:54:06.34 ID:+6kSxcdv.net] unfoldより関係が分かりにくくなるけど キャプチャした変数を使うfrom_fnという手もある fn countup<T>(start: T) -> impl Iterator<Item=T> where T: TryFrom<usize> + num::CheckedAdd, { let mut n = Some(start); let one = T::try_from(1).ok().unwrap(); std::iter::from_fn(move || { let cur = n.take()?; n = cur.checked_add(&one); Some(cur) }) }
24 名前:デフォルトの名無しさん mailto:sage [2022/05/15(日) 10:54:14.40 ID:duXfvT8B.net] 大人が集まってくつろいでるところに 子供がガラッと入ってきて九九の暗唱しはじめたら 頑張ってるのがほほえましくて応援しちゃうでしょ でも 大人がガラッと入ってきて九九の暗唱しはじめたら ギョッとするし不安になってくるやろ なぜそんなもんをお披露目しちゃうのか なぜ得意げになって頑張ってるのかわからない もういいよ!と単に言えばいいのか 続きはカーチャンに見えもらってね!と言えば良いのか 言って分かってもらえる気配もないので怖い
25 名前:デフォルトの名無しさん mailto:sage [2022/05/15(日) 11:10:33.42 ID:+6kSxcdv.net] 今回はこれでもいい fn countup<T>(start: T) -> impl Iterator<Item=T> where T: TryFrom<usize> + num::CheckedAdd, { let one = T::try_from(1).ok().unwrap(); std::iter::successors(Some(start), move |n| n.checked_add(&one)) }
26 名前:デフォルトの名無しさん mailto:sage [2022/05/15(日) 11:16:38.61 ID:yna4qlqc.net] はちみつおじさん悔しそうwww
27 名前:デフォルトの名無しさん mailto:sage [2022/05/15(日) 12:24:43.22 ID:Q7/PweS0.net] 九九と違って子供用のおもちゃプログラムでしか使えないコードなんだよなぁ
28 名前:デフォルトの名無しさん mailto:sage [2022/05/15(日) 12:39:00.79 ID:+mKsOYSe.net] 代案出さずに文句だけつける万年野党みたいなやつがいるな
29 名前:デフォルトの名無しさん mailto:sage [2022/05/15(日) 13:13:50.62 ID:gyw6bZ1I.net] >>25 それまんま>>17 やんけ
30 名前:デフォルトの名無しさん mailto:sage [2022/05/15(日) 14:22:42.46 ID:Cy+Jf1ha.net] 九九のように簡単だという皆さま方に質問です countup()が7通り(?)も色んな書き方が出てきて驚いたのですが フィボナッチ数列だとどんな華麗なコードになりますか? fn fibonacci<T>() -> impl Iterator<Item=T> where T: TryFrom<usize> + num::CheckedAdd, { // ここを記述 } 出力仕様は一番ベーシックな0スタートとします 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
31 名前:デフォルトの名無しさん mailto:sage [2022/05/15(日) 15:13:51.95 ID:4TECkVdc.net] >>30 「Rustのお題スレ」でも立ててそっちでやってくれ
32 名前:デフォルトの名無しさん mailto:sage [2022/05/15(日) 15:27:49.70 ID:Cy+Jf1ha.net] >>31 難しくて解けないという表明ですか? どういう点が難しかったのか教えてください
33 名前:デフォルトの名無しさん mailto:sage [2022/05/15(日) 15:40:51.12 ID:hZXiQ87C.net] 教えてもらったsuccessorsを披露したくてしょうがない幼児メンタルwww >>24 の言う通りだな
34 名前:デフォルトの名無しさん mailto:sage [2022/05/15(日) 15:49:35.48 ID:AAncJnA8.net] >>33 successorsは適用範囲が非常に狭いので>>30 の例には使えないはず
35 名前:デフォルトの名無しさん mailto:sage [2022/05/15(日) 16:09:35.61 ID:Cy+Jf1ha.net] >>33 ぜひそれを披露してやり方を教えてください
36 名前:デフォルトの名無しさん mailto:sage [2022/05/15(日) 16:27:05.61 ID:KYkY1Akn.net] フィボナッチ数列イテレータ前スレでだれかが書いてたでしょ それじゃいかんの
37 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 07:04:42.44 ID:nGMMRLLq.net] >>36 CopyやCloneを使っているから別問題だろう。 一般的にRustのプログラミングでは、 Copy(暗黙的な自動コピー)やClone(clone()による明示的な手動コピー)を使うと楽になるが、コストは高くなる。 そのため不要なclone()を見極めてそれを回避するプログラミングが出来るかどうか、というRustにおける根源的な話だろう。
38 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 07:28:24 ID:JrfUQrzl.net] Copyのコストが高い?
39 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 08:00:50.97 ID:nGMMRLLq.net] >>38 もちろんCopyは最もコストが高い。 個々のコスト自体は通常clone()と同じだが、常に自動的にclone()が起きるため最もコストが高くなる。
40 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 08:58:48.98 ID:tFcB4vDN.net] 複製おじさんはいつも自分勝手な妄想を「一般的には~」とか「皆は~」と言って自分を正当化しようとするよね
41 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 10:03:10.22 ID:0DWo1Xps.net] >>40 間違いは誰にでもあるからまだいいんだが 指摘されても反省するどころかさらなる妄想を撒き散らすのがほんと迷惑
42 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 11:11:33 ID:02kk6/+P.net] おじさん使いの人の自演がいつもよくわからん 唐突に妄想(?)を攻撃し出すが幻覚か何か見えてるのか
43 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 16:19:03.24 ID:NE3SiQoq.net] >>39 Cloneのコストが高い型にCopyを実装するな
44 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 16:30:48.20 ID:JLeK8lGd.net] Copyはコストが一番高いから出来る限り避けるべきだな 特にヒープを使うならCloneまでにしておくべき 可能ならばCloneも避けるべきだが
45 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 18:08:42.72 ID:ThGcWJJo.net] Copyは所有権を複製するから最も高コスト(キリッ!!
46 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 18:10:04.46 ID:ThGcWJJo.net] もはやどのレスもギャグにしか見えん 俺のしってるCopyとは確実に違う
47 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 18:38:28.59 ID:qW5+0T97.net] 今までで一番意味不明なこと言ってるな Copyのコストが高いならmoveのコストはどうなるのよ
48 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 18:44:18.84 ID:Mb2xQVjt.net] >>45 所有権に複製という概念はない Copyをimplすると使われる時に値が自動的に複製される そのためCopyは最も高コスト >>46 君のレスがギャグにしか見えん
49 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 18:47:50.19 ID:/5k6Bg80.net] Rust のムーブはビットパターンのコピーだもんな。 低レイヤの視点で見たらコピーと何の差も無い。 なるべく参照を使う場合にしても間接参照の実行コストとコピーの実行コストを天秤にかけてどちらが有利かは場合による。
50 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 18:55:12.38 ID:W7mPHnnh.net] >>47 それは理解不足すぎるぜ 大文字のCopyはCopyトレイトを意味しCopyトレイトを実装するか否かの話だろ moveは別方向の話であり比較対象にすらならない 比較するならば「Copy実装(必然的にClone)も実装」「Cloneのみ実装」「どちらも実装なし」の3つだな
51 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 19:00:08.16 ID:GLqKLCqS.net] >>48 ギャグだと分からない人がいるとは想定していませんでした。 誤解を招いたのであれば申し訳ございません。
52 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 19:06:18.85 ID:78bNbDCr.net] >>49 デタラメすぎ ムーブでビットパターンのコピーは発生しない ビットパターンのコピーが発生するのは引数の値渡し等であってムーブとは関係ない さらに引数の値渡しでのでビットパターンのコピーとCopyのコピーも全く異なる Copyのコピーはディープであって高コスト
53 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 19:08:38.74 ID:NE3SiQoq.net] そもそもフィボナッチ数列イテレータなんて誰も求めてないので 前スレのだれかさんの実装に問題があると思うなら自分で勝手に改善してなさい そしてその結果はここに貼らなくていいぞ
54 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 19:11:06.58 ID:zgsMMZOB.net] 「ヒープ使うならCloneまでにしとけ」 このセリフが一番刺さった
55 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 19:11:50.62 ID:rHnqcaqs.net] >>52 おじさんマジかよwww
56 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 19:22:59.76 ID:NE3SiQoq.net] >>54 Dropを実装する型はCopyを実装できないよ BoxもRcもStringもVecもそもそもCopyを実装できないので、するかしないか考えること自体が無意味 どういう型にCopyを実装できるか、できないか、すべきかはdocsに書いてあるので なんのかんの言う前にまずはこれを読もうね https://doc.rust-lang.org/std/marker/trait.Copy.html
57 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 19:37:56.79 ID:tTdd7GU5.net] >>53 これだけCopyやCloneを理解していない連中が多い状況だと >>30 の質問に答えられるかどうかは最低限クリアすべきテストとして有用ではないか? フィボナッチ自体はもちろんどうでもよい話だがCopyやCloneを避けるRustの基本ができるかどうかわかる点で
58 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 19:45:37.77 ID:/5k6Bg80.net] >>52 じゃあムーブでなにが起こるとおもってんの?
59 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 19:54:25.89 ID:SHnkjBGX.net] >>53 > フィボナッチ数列イテレータなんて誰も求めてない それはそうなんだけど 唯一本人にとっては伝家の宝刀だから 少なくともこのスレいっぱいまでは引っ張って 何度も何度も参照するはず
60 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 20:38:11.38 ID:NE3SiQoq.net] フィボナッチがどうでもいいならこの話は終わりです
61 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 20:45:13.08 ID:Mz4z3EAu.net] 関数の深いところから順に構造体をムーブで返していって 各関数で渡ってきた構造体のアドレスを表示させてみた #[derive(Debug)] struct S([i32; 100]); fn main() { let mut s1 = sub1(100); s1.0[1] = 111; println!("s1: {:p}", &s1); println!("{s1:?}"); } fn sub1(p: i32) -> S { let q = p + 3; let mut s2 = sub2(q); s2.0[2] = p - 300; println!("s2: {:p}", &s2); s2 } fn sub2(s: i32) -> S { let t = s * 2; let mut s3 = S([123; 100]); s3.0[3] = t; println!("s3: {:p}", &s3); s3 } s1もs2もs3もアドレスが一致 ムーブではアドレスそのままであり ビットパターンのコピーが為されないという結論
62 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 20:58:36.88 ID:qW5+0T97.net] >>50 "Copyのコストが高い" は Copy を実装する行為そのもののコストが高いと解釈すべきということ? そんなばかな >>52 ドキュメント読みましょうねー https://doc.rust-lang.org/stable/std/marker/trait.Copy.html > It’s important to note that in these two examples, the only difference is whether you are allowed to access x after the assignment. > Under the hood, both a copy and a move can result in bits being copied in memory, although this is sometimes optimized away. ... > The behavior of Copy is not overloadable; it is always a simple bit-wise copy. ... > The implementation of Clone can provide any type-specific behavior necessary to duplicate values safely. > For example, the implementation of Clone for String needs to copy the pointed-to string buffer in the heap.
63 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 21:06:43.52 ID:qW5+0T97.net] >>61 アドレスが同じか否かでコピーの有無を判断する意味はよくわからんが その理屈だとこのコードだと違うアドレスが表示されるからビットパターンのコピーがされてるって結論になるのか? #[derive(Debug)] struct S([i32; 100]); fn main() { let mut s1 = S([0; 100]); println!("s1: {:p}", &s1); let s2 = s1; println!("s2: {:p}", &s2); }
64 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 21:07:20.55 ID:f/Xu02FO.net] >>61 struct S {} fn main() { let s1 = S{}; println!("s1: {:p}", &s1); let s2 = s1; println!("s2: {:p}", &s2); }
65 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 21:08:00.98 ID:f/Xu02FO.net] ごめん被った。やっぱそう思うよね。
66 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 21:16:19.81 ID:9Ab93Lwf.net] >>56 ちょっとw なんで刺さったのか少しは考えてよww ギャグゴロシめ
67 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 21:19:28.47 ID:51EzJkQ/.net] >>61 >>63 その二つの相異なる結果を見るとビットパターンのコピーはムーブ以外の要因で起きている??
68 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 21:30:56.46 ID:W905eBh/.net] >>57 一番分かってないお前が言うなよw
69 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 21:38:19.38 ID:/vD2A9J9.net] >>61 高コストなCopyも実装してから確認してみてねww
70 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 21:38:29.32 ID:NE3SiQoq.net] >>66 ごめんよ 刺さったって「ためになった」みたいな意味で言ってるのかと思ったよ てっきりオジの自演かと
71 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 21:39:12.01 ID:DoCeaK1g.net] >>67 デバッグビルドだけじゃなくリリースビルドでも確認してねw
72 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 21:42:44.19 ID:51EzJkQ/.net] >>71 リリースモードでもどちらも同じ結果
73 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 21:49:25.30 ID:sElCPUyn.net] >>72 ごめんよー >>64 と間違えた
74 名前:デフォルトの名無しさん mailto:sage [2022/05/16(月) 23:46:37.66 ID:jfEIc0ZW.net] このスレはいつもおかしい人間たちが集まってるな Rustの何が人を狂わせるんだ?
75 名前:デフォルトの名無しさん mailto:sage [2022/05/17(火) 00:09:43.95 ID:HbNyXd2X.net] おじさんイジリ飽きたので結論いっておく Copyもmoveもスタックの中身をコピーしてるのは同じ 最適化によって不要なコピーが除去されるかどうかはLLVM次第 でかい配列やでかい構造体などの極一部を除けばCopyは参照の受け渡しよりも低コスト ついでに言うと&TもCopy
76 名前:デフォルトの名無しさん mailto:sage [2022/05/17(火) 00:26:01.61 ID:+9bLcV37.net] >>75 頭悪すぎ Copyが低コストなのではなく 低コストなものだけにCopyが実装されている なぜならCopyは高コストであるため
77 名前:デフォルトの名無しさん mailto:sage [2022/05/17(火) 02:09:56.03 ID:2XRLgT14.net] >>76 ここでいうCopyのコストって具体的にどういう操作のコストのこと言ってる? 構造体データのbitwise-copyのこと?それとも別の何か? Cloneやmoveの場合にそのコストは発生しないと主張しているの?
78 名前:デフォルトの名無しさん mailto:sage [2022/05/17(火) 02:13:55.30 ID:tAEVG8cC.net] >>62 ほーCopyってCloneの実装によらずmemcpy相当の結果になるのか 自動的に.clone()が差し挟まれる感じかと思ってた
79 名前:デフォルトの名無しさん mailto:sage [2022/05/17(火) 07:41:41.18 ID:1GDSnWAB.net] >>78 俺も同じくCopyは自動的にclone()されると思ってた そう思ってた理由はClone実装せずにCopy実装するとエラーとなるため そこで実験 #[derive(Debug,Copy)] struct S { not_cloned: usize, cloned: usize } impl Clone for S { fn clone(&self) -> Self { S { not_cloned: self.not_cloned / 3, cloned: self.cloned } } } fn main() { let s0 = S { not_cloned: 123, cloned: 456 }; let s1 = s0.clone(); let s2 = s0; // copy println!("Cloned: {s1:?}"); println!("Copied: {s2:?}"); } 結果 Cloned: S { not_cloned: 41, cloned: 456 } Copied: S { not_cloned: 123, cloned: 456 } 別物になった…
80 名前:デフォルトの名無しさん mailto:sage [2022/05/17(火) 10:53:02 ID:GxF458pr.net] >>52 >>>49 >デタラメすぎ >ムーブでビットパターンのコピーは発生しない >ビットパターンのコピーが発生するのは引数の値渡し等であってムーブとは関係ない >さらに引数の値渡しでのでビットパターンのコピーとCopyのコピーも全く異なる >Copyのコピーはディープであって高コスト このレス最強だな 一つ一つの文すべてが間違ってる 「デタラメすぎ」てw
81 名前:デフォルトの名無しさん mailto:sage [2022/05/17(火) 14:50:42.61 ID:94ESmIzZ.net] ガイジムーブ来てんね
82 名前:デフォルトの名無しさん mailto:sage [2022/05/17(火) 21:03:27.69 ID:VS5jQHYL.net] Copyはshallow copyだわな
83 名前:デフォルトの名無しさん mailto:sage [2022/05/17(火) 22:07:44 ID:LjbtS7tD.net] 色々と正確な情報が出揃ったところで質問 まず前提として話を明白かつ簡単にするため、 ここでは!DropつまりCopy実装可能な型のみ対象、 そしてもしClone実装するならば*selfつまりCopy実装と同一、 CloneやCopyを実装するかどうかは任意、 小文字のcloneとcopyはそれぞれCloneやCopyを実装した時にそれらが使われることを意味するとする このとき、次のどちらの主張が正しい? A「copy/cloneはコストが生じるので、回避できるならば回避したほうが有利」 B「copy/cloneのコストはmoveと同じなので回避する必要はない」
84 名前:デフォルトの名無しさん mailto:sage [2022/05/17(火) 22:30:37.28 ID:VUKzLr9a.net] 場合による。 たとえコピーであっても結局は内容が同じものであると看破すれば 実際にはコピーしないようなコードを生成するといったことは有りうる。 Rust は原理的にエイリアス解析がやりやすい言語だと思うし。 実行コスト的にどうかなんて考えずに所有権管理の側面からの妥当性で決めたほうがよい。 その上でどうしても実行コストを切り詰めないといけないようになったならその時に考えればいい。
85 名前:デフォルトの名無しさん mailto:sage [2022/05/17(火) 22:33:27.98 ID:5/60CrrJ.net] >>83 前提もまちがってるが 比較する対象がそもそも意味がない もうちょっと勉強してから出直して
86 名前:デフォルトの名無しさん mailto:sage [2022/05/17(火) 23:40:20.70 ID:XaJZCLYj.net] >>83 >A「copy/cloneはコストが生じるので、回避できるならば回避したほうが有利」 何と比べてコストが生じると言ってるの? 回避した場合は何で代用するつもりなの?
87 名前:デフォルトの名無しさん mailto:sage [2022/05/17(火) 23:43:19.03 ID:nlEgMvZ6.net] 考えてみたけどmove/copyが問題になるレベルの大きさの型をスタックに置いて扱ったことが無いな… 使うとすれば固定長配列のバッファ? でもそんなものmove/copyするわけないし やっぱり考える意味の無い二択だと思う
88 名前:デフォルトの名無しさん mailto:sage [2022/05/17(火) 23:47:41.13 ID:FqAlYuq2.net] >>86 回避する前と回避した後の比較だろう 回避したコードが書けたならばcopyの代用の必要はない
89 名前:デフォルトの名無しさん mailto:sage [2022/05/17(火) 23:49:36.53 ID:YviCLBk+.net] >>83 一般的にはAが正しい ただし>>84 が言うように無駄なコピーが消える場合もある A「copy/cloneはコストが生じるので、回避できるならば回避したほうが有利になることがある」ならば正確
90 名前: Bについては前半はある意味正しいとしても後半が間違い >>85 批判や主張はその理由を伴わないと議論とならず意味がない [] [ここ壊れてます]
91 名前:デフォルトの名無しさん mailto:sage [2022/05/17(火) 23:54:01.76 ID:VUKzLr9a.net] >>89 > 批判や主張はその理由を伴わないと議論とならず意味がない 基本的にはそうだが、こっちが説明しても理解できるレベルに達してない場合にはどうせ議論にならんのでな。
92 名前:デフォルトの名無しさん mailto:sage [2022/05/17(火) 23:55:13.39 ID:tAEVG8cC.net] あっこの流れC++相談室で見たやつだ
93 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 00:07:06.58 ID:P5Km+xQv.net] 要は参照使えるなら使っとけって? 今更すぎませんか
94 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 00:30:37.66 ID:DGffctwq.net] オナコードペタペタされてたほうがマシだったなこりゃ
95 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 00:45:17.78 ID:opn2S8Zb.net] >>92 それもあるが、例えば多数のコピーが行われているコードに対して、回避できる分を見直し、少数のコピーで済むように改善できる場合もある Copy実装せずに明示clone()した方が見つけやすいかもしれない
96 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 01:26:17.77 ID:lxQ5l4ey.net] >>88 さすがに意味が分からないよ 値の受け渡しにcopyを使わないなら何が他の方法を使う必要があるでしょ
97 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 01:42:43.25 ID:d5NnfCmB.net] 一人だけ間違った思い込みをしてるのに 説明されても「俺は間違ってない、間違ってるのはお前ら」が続くだけだからな
98 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 01:46:16.75 ID:6ezlEFaX.net] >>95 頭が硬すぎないか? 回避できる分を回避するだけだろ 回避できない分まで回避する、と思い込んてるのはYouのみ
99 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 01:51:55.82 ID:Da/MVUm8.net] >>89 「○○はコストが生じるので、回避できるならば回避したほうが有利になることがある」 言葉の定義を明確にしないジェネリック文は 恣意的に常に真にも常に偽にもできる
100 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 02:06:14.30 ID:UgigdTUo.net] >>90 無駄にプライド高いな 嫌われるぜ
101 名前:デフォルトの名無しさん mailto:sage [2022/05/18(水) 07:08:20 ID:bcZKOTNR.net] 大きいフィールドを持つ型には、Copyは実装しないだろうし普通はCopy/Moveのコスト差を気にすることなくない? どちらにすべきかボーダーが難しいことはありそうだけど