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

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
exist trace VS Aldious
TRUST RECORDS [無断転載禁止]
【SOP】Borussia Dortmund vs Real Madrid [無断転載禁止]
プログラミング言語 Rust 4
[FPSサバイバルMMO] Play Rust Part31
プログラミング言語 Rust 4【ワッチョイ】
プログラミング言語 Rust 4【ワッチョイ】
[FPSサバイバルMMO] Rust 統合スレ Part41
プログラミング言語 Rust 3 [無断転載禁止]
[FPSサバイバルMMO] Play Rust Part37
次世代言語Part7[Go Rust Swift Kotlin TypeScript]
次世代言語15 Go Rust Swift Kotlin TypeScript
次世代言語14 Go Rust Swift Kotlin TypeScript
次世代言語14 Elixir Crystal Julia Rust Swift
[FPSサバイバルMMO] Rust 個人鯖総合スレ Part2
次世代言語9[Haskell Rust Kotlin TypeScript Dart]
【HMD】Oculus Quest Part.12【6DoF VRStandalone】
次世代言語12 Go Rust Swift Kotlin TypeScript
次世代言語13 Go Rust Swift Kotlin TypeScript
次世代言語18 Go Rust Elixir Kotlin TypeScript
[FPSサバイバルMMO] Rust 統合スレ Part40 
次世代言語21 Go Nim Rust Swift Kotlin TypeScript
次世代言語Part8[Haskell Rust Kotlin TypeScript]
次世代言語議論スレ[Go Rust Kotlin Scala]第4世代 [無断転載禁止]
次世代言語議論スレ[Go Rust Scala Haskell]第5世代
次世代言語17 Go Rust Kotlin TypeScript Julia
次世代言語15 Go Rust Bosque Kotlin TypeScript
[FPSサバイバルMMO] Play Rust Part34 [無断転載禁止]
[FPSサバイバルMMO] Play Rust Part36 [無断転載禁止]
[FPSサバイバルMMO] Play Rust Part34 [無断転載禁止]
次世代言語議論スレ[Go Rust Haskell Scala]第3世代 [無断転載禁止]
次世代言語議論スレ【Go Rust Haskell Scala Erlang Elixir】 [無断転載禁止]
【あなたは】「BOOWY V by佐久間正英 」vs「JUST A HERO by布袋寅泰」【どっち?】
Java/C++ VS C# どっちが好きか教えて
Vue vs React vs Angular Part.5
Vue vs React vs Angular その2
Vue vs React vs Svelte Part.7
Vue vs React vs Angular Part.4
C++ Builder vs C# どっちがいいか教えて
Vue vs React vs Angular Part.2
Vue vs React vs Angular Part.3
Vue vs React vs Angular Part.4
Vue vs React vs Angular vs Svelte Part.8
ルート作成 Strav(ストラバ) vs Ride with GPS(RWG)
Vue vs React vs Angular vs jQuery Part.3
【PSP】ガンダムVS.ガンダムNEXT PLUS Part111
ガンダムVSガンダム NEXT PLUS 再現 改造スレ
FIFA Confederations Cup Russia 2017★10 ©4ch.net [無断転載禁止]
FIFA Confederations Cup Russia 2017★10 [無断転載禁止]©3ch.net [無断転載禁止]
【嫌儲英語部】Let’s talk about Russo-Ukrainian conflict in English🇺🇦🇷🇺
Trust me
Rust part9
Rust part10
Rust part8
Rust Part5
Rust part11
Rust part13
Rust Part6
Rust Part7
加藤純一のRUST
ご褒美Rust #3668
Russkij Avanpost
12:23:32 up 29 days, 22:47, 0 users, load average: 6.99, 8.05, 8.60

in 0.030827045440674 sec @0.030827045440674@0b7 on 011102