◎正当な理由による書き込みの削除について:      生島英之とみられる方へ:

C++ vs Rust


動画、画像抽出 || この掲示板へ 類似スレ 掲示板一覧 人気スレ 動画人気順

このスレへの固定リンク: http://5chb.net/r/tech/1619219089/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。

1デフォルトの名無しさん2021/04/24(土) 08:04:49.48ID:nPKzA798
競え

2デフォルトの名無しさん2021/04/24(土) 09:03:31.43ID:CqGuC/ho
何で?

3デフォルトの名無しさん2021/04/24(土) 09:10:09.42ID:MAG7Rri7
どちらも変なプライド拗らせたアホしかいない印象

4デフォルトの名無しさん2021/04/24(土) 10:50:18.68ID:N1eYD/7j
C++: カミソリ
Rust: 安全カミソリ

5デフォルトの名無しさん2021/04/24(土) 11:18:00.79ID:gMqF1SGc
別に〜
裏方一緒だし

6デフォルトの名無しさん2021/04/25(日) 11:37:52.88ID:vJWG11Gh
一概にどちらが優れているとは言えないことではあるが、
代入やコンストラクタが、moveとcopyのどちらになるかについて、Rustの
方が自動化が進んでいると思いがちだが、実際は、
C++は、関数の戻り値が構造体型/クラス型になっている場合に関しては
RVO(Return Value Optimization)が働き、右辺が
クラス名(実引数列)
の形式の一時オブジェクトである場合には、moveが選ばれるが、それ以外は、
概ねcopyになるので、ある意味では「自動選択」しているのに対し、
Rustでは、x = y と書いた場合、原則的には「デフォルトmove」の規則に
従い、copyしたい場合は、右辺をy.clone()と書くことになっていて、
「手動選択」を採用している。
C++は、どう書いた場合にmoveになり、どう書いた場合にcopyになるかを全て把握するのは
難しくて、C++の仕様が勉強不足だと勘違いや見落としが発生する可能性があるのに対し、
Rust方式は、moveとcopyのどちらになるかが明確なので混乱が少ないと言えるかも知れない。
つまり、このことに関しては、児童選択より手動選択の方が安心感があるかも知れない。
意見を求む。

7デフォルトの名無しさん2021/04/25(日) 11:57:11.84ID:Ef2Yns/P
Copy trait実装してたら暗黙的に実行されるわ。
とはいえc++のそれよりかは分かり易いけど。

8デフォルトの名無しさん2021/04/25(日) 13:18:15.15ID:rtrHqrCb
[C++]
xやfunc()の戻り値が CPerson というクラス型の場合、
10. x = y; // copy代入。yの中味はxにコピーされる。yのデータも保存。
11. x = std::move(y) // move代入。yのデータは破棄される。
12. x = func(a); // move代入または、RVOが働いてmove代入以上に速い動作になる。
          関数の戻り値だけは特別に処理されている。

[Rust]
(CPerson がCopy traitを実装して無い場合に限定)
20. x = y; // move。以後、y は使用できなくなる。これが故にデフォルトmoveと呼ばれる。
21. x = y.clone(); // copy。以後もyは使用できる。
22. x = func(a); // move。20.と同じ規則に従っているだけで関数の戻り値だから特別では無い。

C++の場合、12.で関数だけは特別処理されているのに対し、Rustの22では
関数でも特別処理されているわけではなく、20.のデフォルトmoveの原則に従っているだけ
のように見える。
C++の場合、11. では、std::move()で修飾すると、なぜか、10. で修飾しなかった場合
より、実行されるCPUの処理が「減る」。ソースコードで関数の様なものを
追加した方が追加しなかったときよりCPUの処理が減ってしまうのは、どことなく直感に
反する。
一方、Rustの21と20を比較すると、.clone()を書いた方が書かなかったときより、
実行されるCPUの処理が増えるので、直感的である。
この場合、.clone()を書いたことで「コピーするためにCPUの処理が追加された」という
直感に沿った感じになるから。
C++の場合、std::move()と書くと「std::move()という関数の様なものを書いたのに、
なぜか、CPUの処理が減る」という違和感を感じるようになる。

9デフォルトの名無しさん2021/04/25(日) 17:13:07.94ID:In1fvQYU
要はRustの代入ってmemcpyで、単純なmemcpyされると困るデータ(!Copy)の場合右辺がinvalidate(move)され使えなくなる
って理解がシンプルなのかな

10デフォルトの名無しさん2021/04/25(日) 18:00:12.34ID:S2tV53BX
>>9
x = y の時、
結果的にはほとんどmemcpy(&x,&y,サイズ)に近い動作になっているかもしれないな。
ただ、右辺yの構造体メンバの中にRc<T>のような複雑なものが入っている場合、
結果は単純コピーのようになったとしても、コンパイラはもっと丁寧に処理
しているのではなかろうか。

11デフォルトの名無しさん2021/04/26(月) 01:44:08.26ID:+85I2LX6
>>10
move は memcpy だよ
Rc も実体はヒープへのポインタだから memcpy で問題ない
memcpy してはいけない例としては async fn みたいな自己参照構造体などがあるけど
Pin をうまく使うことで変な状態にならないようにしている

12デフォルトの名無しさん2021/04/26(月) 17:23:54.42ID:92SW7900
c++に批判的な姿勢で知られるlinusがなぜrustにはwelcomeな態度取ってるのかが理解できない
rustだってメモリ安全性がなければc++みたいなもんだろ

13デフォルトの名無しさん2021/04/26(月) 17:27:49.70ID:oHxAx7LN
言うほどwelcomeか?

14デフォルトの名無しさん2021/04/26(月) 17:29:26.57ID:92SW7900
>>13
貶すまではいってないじゃん

15デフォルトの名無しさん2021/04/26(月) 18:48:21.42ID:pZ6mft9e
あわしろ氏もRustは凄いって言ってましたね。
C++をあまり好きじゃないところも同じ。

16デフォルトの名無しさん2021/04/26(月) 20:08:40.47ID:cN+lbm0F
>>12
c++にもだいぶ甘くはなってるよ。
ただそれでもrustに対してもそこまで容認的ではない。
試しにドライバー書いてみれば?って言って試させてるが、まだまともには考えてないわ。
https://lkml.org/lkml/2021/4/16/901

17デフォルトの名無しさん2021/04/26(月) 20:27:04.95ID:92SW7900
>>16
むしをrust側に対して例外処理の方法をカーネル内での往来の方法に変更してくれって促しているように見えるんだけど
導入したがってるやんけ

18デフォルトの名無しさん2021/04/26(月) 20:51:20.12ID:cN+lbm0F
>>17
続きを読めば?どういう流れかわかるから。

19デフォルトの名無しさん2021/04/26(月) 21:27:22.23ID:92SW7900
>>18
続きで懐疑的な立場取ってんのlinusじゃなくね?

20デフォルトの名無しさん2021/04/26(月) 22:53:32.32ID:cN+lbm0F
>>19
話の流れは大体予想できてただろうなという受け答えだろ。
んでもって実際、発案者自らmoonshot言うとるわ。
少しは内容を読んでくれ、なんで一から十まで説明しなきゃならんのか。

21デフォルトの名無しさん2021/04/26(月) 23:32:00.78ID:92SW7900
>>20
じゃあレスすんなよカス

22デフォルトの名無しさん2021/04/26(月) 23:47:01.17ID:cN+lbm0F
だから読めって。。文盲なんか?

23デフォルトの名無しさん2021/04/27(火) 00:14:36.96ID:H90KgUtd
>>20
moonshotって言ってるの割り込みコンテキストでallocator呼び出すことをコンパイル時にチェックできるようにしたいという話では
現実的には関数ごとにどのコンテキストで呼び出せるものなのかタグ付けしてるとかなんとか
綺麗じゃないけど、まあ動くわなという解決策

つまみ食いしかしてないから読み違えてるかも知れないけど
これをもってlinuxカーネルにrust取り込むのを否定するような話ではないようにみえた

他にもmoonshotって言ってる箇所ある?

24デフォルトの名無しさん2021/04/27(火) 01:12:51.08ID:VJIOoOWO
一通り読んだけど他にmoonshotって言ってるとこはなかったような。

25デフォルトの名無しさん2021/04/27(火) 08:00:23.09ID:/+bIFNU8
>>23
あのね。。書けばそうなるってものじゃなくてそれを実装しなきゃならんのよ。。
コンパイラにそういったコンテクストを判断させるのがめちゃくちゃ難しいっていってるでしょ?
なんでそんなに読み取れないの?

26デフォルトの名無しさん2021/04/27(火) 15:37:12.22ID:Nn42Sot0
>>25
当面はdoc commentにannotation書いて済ませておくって言ってるやん
何はともあれ大局的にはrustをlinux kernelに取り込む方向へ進んでいくことには間違いない

27デフォルトの名無しさん2021/04/27(火) 16:10:45.63ID:/+bIFNU8
>>26
だからそのコードじゃpanic捉えきれねーからカーネルに入れるわけねーだろって
言ってんじゃん。。何読んでんだよ。

28デフォルトの名無しさん2021/04/27(火) 18:23:48.67ID:n/AWrch2
まあ半年後どうなるかで誰が正しかったかは分かるわな

29デフォルトの名無しさん2021/04/27(火) 20:32:29.92ID:/+bIFNU8
半年も経たなくてももうわかってるっつーの。。だからちゃんと英語の勉強しましょうね。

30デフォルトの名無しさん2021/04/28(水) 03:52:50.81ID:v8E9sca8
C++で、n要素のint型の生配列を確保するには、
int *pBuf = new int [n];
だけど、Rustの
let a:Box<i32> = Box::new<x>;
値が x である 32BIT 整数を Heap に 1 つ確保する、という意味だよね?
Heapに n 要素の i32 型の配列を確保したい場合、
let a:Vec<i32> = vec![0; n];
かな?

31デフォルトの名無しさん2021/04/28(水) 03:55:12.80ID:v8E9sca8
>>30
あ、
let a:Box<i32> = Box::new<x>;
ではなく、
let a:Box<i32> = Box::new(x);
let a:Box<i32> = Box<i32>::new(x);
let a = Box::new(x);
let a = Box<i32>::new(x);
かな。

32デフォルトの名無しさん2021/04/28(水) 04:01:18.27ID:v8E9sca8
>>31
確保した領域の中身を書き換えたい場合は「mut」を付ける必要があり、
値が x である 32BIT 整数を Heap に 1 つ確保するのは:
let mut a:Box<i32> = Box::new(x);
let mut a:Box<i32> = Box<i32>::new(x);
let mut a = Box::new(x);
let mut a = Box<i32>::new(x);
のどれかの書き方で、Heapに n 要素の i32 型の配列を確保するのが、
let mut a:Vec<i32> = vec![0; n];
let mut a = vec![0; n];
のどちらかの書き方かな?

33デフォルトの名無しさん2021/04/28(水) 10:37:51.57ID:6K8rF/jG
let mut a = Box::new([0,n]);

34デフォルトの名無しさん2021/04/28(水) 12:44:00.99ID:jQpDsyge
>>33
なるほど、そんな書き方があったとは。でも正しくは、
let mut a = Box::new([0; n]);
かな?

35デフォルトの名無しさん2021/04/28(水) 15:21:28.78ID:jQpDsyge
[0; n]
って、n 要素のi32配列を確保して0で初期化するという意味らしいけど、
nは実行時に決まらないような変数も指定できるの?

36デフォルトの名無しさん2021/04/28(水) 16:30:39.18ID:BfdKSrwu
>>35
できない

https://stackoverflow.com/questions/41710952/allocate-array-onto-heap-with-size-known-at-runtime

Vec<i32>に相当するのはstd::vector<int>だから、
>>33はstd::unique_ptr<int []>相当のBox<[i32]>型の例を出そうとしたのだろう
そういう値は作れるが、Box::newでは無理


lud20210723234114
このスレへの固定リンク: http://5chb.net/r/tech/1619219089/
ヒント:5chスレのurlに http://xxxx.5chb.net/xxxx のようにbを入れるだけでここでスレ保存、閲覧できます。

TOPへ TOPへ  

このエントリをはてなブックマークに追加現在登録者数177 ブックマークへ


全掲示板一覧 この掲示板へ 人気スレ | Youtube 動画 >50 >100 >200 >300 >500 >1000枚 新着画像

 ↓「C++ vs Rust 」を見た人も見ています:
Rust vs Go
【PSP】ガンダムVS.ガンダムNEXT PLUS Part111
【あなたは】「BOOWY V by佐久間正英 」vs「JUST A HERO by布袋寅泰」【どっち?】
exist trace VS Aldious
ガンダムVSガンダム NEXT PLUS 再現 改造スレ
【SOP】Borussia Dortmund vs Real Madrid [無断転載禁止]
Vue vs React vs Angular vs Svelte Part.8
Oculus Rift マターリスレ &#169;2ch.net
【☆】矢沢永吉 Part265【 ROCK MUST GO ON 】
次世代言語Part7[Go Rust Swift Kotlin TypeScript]
Vue vs React vs Angular Part.5
【HMD】Oculus Rift 52【VR/Touch】
【HMD】Oculus Rift 68【VR/Touch】
[FPSサバイバルMMO] Play Rust Part31
[FPSサバイバルMMO] Rust 統合スレ Part41
iPhone6 vs iPhone6PLUS
【HMD】Oculus Rift 52【VR/Touch】
【HMD】Oculus Rift 75【VR/Touch】
【HMD】Oculus Rift 65【VR/Touch】
【HMD】Oculus Rift 71【VR/Touch】
次世代言語9[Haskell Rust Kotlin TypeScript Dart]
Huawei(ヒューエイ) vs ASUS(アザース)
次世代言語議論スレ[Go Rust Kotlin Scala]第4世代 [無断転載禁止]
【HMD】Oculus Rift 54【VR/Touch】
【HMD】Oculus Rift 72【VR/Touch】
【HMD】Oculus Rift 66【VR/Touch】
Sushi Restaurant in Osaka, Japan
Vue vs React vs Angular その2
Vue vs React vs Svelte Part.7
Vue vs React vs Angular Part.4
Vue vs React vs Angular Part.2
Vue vs React vs Angular Part.3
【ROM焼き】docomo Nexus 5X root Part 2
次世代言語14 Go Rust Swift Kotlin TypeScript
次世代言語14 Elixir Crystal Julia Rust Swift
次世代言語15 Go Rust Swift Kotlin TypeScript
[FPSサバイバルMMO] Rust 個人鯖総合スレ Part2
Karous(カラス) -The Beast of Re:Eden-攻略
【IT】AWS、米政府系リージョン「Secret Region」を発表
Vue vs React vs Angular vs jQuery Part.3
次世代言語議論スレ[Go Rust Scala Haskell]第5世代 [無断転載禁止]
TRUST RECORDS [無断転載禁止]
プログラミング言語 Rust 4【ワッチョイ】
【ゲーム】「The Game Awards」2020年度のノミネート作品が発表。『あつ森』『FF7 REMAKE』『Ghost of Tsushima』など [首都圏の虎★]
【HMD】Oculus Rift 58【VR/Touch】
050plus VS LaLa call
【HMD】Oculus Rift 90【VR/Touch】
【HMD】Oculus Rift 94【VR/Touch】
【HMD】Oculus Rift 86【VR/Touch】
プログラミング言語 Rust 3 [無断転載禁止]
[FPSサバイバルMMO] Play Rust Part37
次世代言語12 Go Rust Swift Kotlin TypeScript
次世代言語13 Go Rust Swift Kotlin TypeScript
【HMD】Oculus Rift/S Part 109【VR/Touch】
次世代言語18 Go Rust Elixir Kotlin TypeScript
【☆】矢沢永吉 Part264【 ROCK MUST GO ON 】
[FPSサバイバルMMO] Rust 統合スレ Part40 
次世代言語Part8[Haskell Rust Kotlin TypeScript]
次世代言語21 Go Nim Rust Swift Kotlin TypeScript
【HMD】Oculus Rift 46【VR/Touch】 [無断転載禁止]
【HMD】Oculus Rift 48【VR/Touch】 [無断転載禁止]
Vue vs React vs Angular Part.4
18:45:19 up 30 days, 5:09, 0 users, load average: 10.02, 9.56, 9.69

in 0.0049960613250732 sec @0.0049960613250732@0b7 on 011108