Rust Part7
■ このスレッドは過去ログ倉庫に格納されています
ヌルポチェック境界チェックしてたら遅くなるに決まってるやん Cはそんなことしなくて済むから爆速な訳で 絶対にめくれないからパンツいらないスカートで アスレチックでもスカイダイビングだもなんでもするのがCだわな 風呂でもセックスでもパンツ脱がないのがRustだわな Rust勉強し始めたんだけど、公式ドキュメント読み終わったら何しよう 何をするにも貞操帯外したり付けたりガチャガチャして複雑になるんだよなあ そんなふうに考えていた時期が俺にもありました でも今はderef coercionでハッピーな毎日です Tのままでチェックするからこうなるんでu32にしてチェックしていいならそうする TもCopy + Into<u32>でトレイト拘束するだけですむ 単にv1.0相当のコードをマクロで生成するのでいい気がするが。 数年後、Rustの世間的な評価はマクロが濫用されてるからクソ になってる気がする そりゃ言語拡張性からいったらマクロは最強だよ。 そんなことは30前にlispが示してる。 ✗ Rustのマクロが汎用されているからクソ ○ プリプロセッサで単純に置換する不健全なマクロを汎用するからクソ Rustはまだましなほう ライブラリで定義するのはいいがプロジェクト内ではレビューの時に面倒だからなるべく書きたくないな 頻出パターンならマクロになってる方がレビューしやすい Cのマクロと違って見た目からマクロであることが明らかだし害は少ない 直接依存するクレートのfeatureはdependenciesに記述できますが、依存するクレートが更に依存するクレートのfeatureをセットしたいときはどうすれば良いんでしょうか エアプだからよく知らんけど依存クレートが依存x2クレートのfeature使うなら依存クレートのtomlにfeature書いてあるし、 依存クレート経由しないで依存x2クレート使うなら自クレートが直接依存してるわけだから自クレートのtomlにfeature書くだけじゃないの? アホに良いコードは書けないのだ アホでも書けるとかいう奴は、アホかアホな組織に属してるかその両方かだ その両方かだ、って一度言ってみたかったんだ 世の中アホが書いたコンパイラの教科書が広く出回っているから紛らわしいな ローカル変数を意図的に snake_case じゃなく書きたいんだが、警告を出さない方法ある? 例えば win32 API 関連を扱う時にやはり camelCase がスマートに思えるシーンがあるんだ allow(non_snake_case) を使いたまへ >>357 怒られなくなりました ありがとうございます ``` #[allow(non_snake_case)] pub fn dummy() { let hWnd = 0; } ``` ノンスネークケースを表す識別子がスネークケースとはいかがなものか。 allow(non_snake_case) これ自身を allow(nonSnakeCase) と書きたいものである ErrorやWarningを出力するときにHelpやNoteで解説も出力してくれてすごく助かる ジェネリクスとPhantomData使って特定の関数呼んだかとかの条件付けるんならせめてエラーメッセージもちゃんとして欲しい(´・ω・`) 要らない何も捨ててしまおう君を探し彷徨うマイソウッ! 関数呼んだかチェックを実行時でなくてコンパイル時にできるってこと? RustとRの違い R データサイエンティストが仕事で使う 言語として結果を出している 速度は残念ながら遅い Rust 陰キャが気持ちよくなるために使う 実績ナシ 速度は速いらしい(ソース無し) RustとRubyの違い とか書くとスレが荒れる時代はもう過去なのかな RubyとRustの違い Ruby 陽キャのおもちゃ 負債作成の実績がある 遅い Rust 陰キャのおもちゃ なにも作られてないので負債も作られていない さすがにRubyよりは速い FirefoxのCSSエンジンとかFirecrackerとかDropboxとかnpmとかあるけど見たくないヤツには見えないからなあ 自分では書きたくない言語 確定申告のようなコーディングスタイル dieselなんかこれじゃない感あるなと思ったらアクティブRecord作った人が作ってるのか 代替ないのかね >>376 プログラマーな時点で陽キャはない ウェイかつオタクという最悪な種族 RustネイティブでQtやGtkレベルのツールキットがほすぃ(´・ω・`) どれもやる気なくてダメポ ttps://gitlab.com/bloom42/research/rust_gui_ecosystem 人それぞれだと思うんであくまで参考に聞かせて欲しいんだけど どれくらいのサイズまで#[derive(Copy)]つけます? Copyって所有権の話であってサイズとは関係なくない? 所有権の観点からCopy実装してはならないケースはあるだろうけど、 してもしなくてもいい場合に考慮するのはサイズと意味だろ。 サイズに関して言えば、自分はu64の10倍くらいまでって感じ。 Rust Language Cheat Sheet 15.09.2019 https://cheats.rs/ いろいろ感謝 よく例題にありそうな struct Point { x: i32, y: i32 } みたいなのなら#[derive(Copy)]しても害はないかなと思って聞いてみた 速度を考えてサイズがusizeの3〜4倍ぐらいまでが相場かなと思ったんだけどね 俺が間違ってんのかな、どうもCopyとMoveの意味を勘違いしてるような… https://doc.rust-lang.org/std/marker/trait.Copy.html こことかにも書いてあるけどMoveでもCopyでも構造体の値自体は(所有権の意味ではなくmemcpyとしての意味での)コピーされるんだから一緒じゃないの? 例えば let x = y; と let x = y.clone(); があったときに前者はノーコストで後者は結構重いかもしれないって感覚があると思うけど、 大きなstructにCopyを実装すると前者で大きなmemcpyが発生してびっくりする、という話。 イメージした状況は違うけどそんな感じ 参照経由で扱いたい大きなデータなのに うっかりコピーされる状況にしちゃって勝手にコピーされるのはちょっと でも小さいデータならコピーされてもいい MicrosoftのC#のドキュメントに何バイトまでstruct (C#における#[derive(Copy)])使う方がいいか 書いてあるのを見た気がする 値は忘れた Sizedなのは当然としてクリッピーなりラストシーが怒ってくれれば気軽に使えるだけどな 使用頻度にも依るんだから計測しろよ 別に難しいことじゃ無いし >>392 >>393 Copyを実装してようがいまいが(=Move) let x = y; したのならどちらも同様にその構造体自体のmemcpyによる複製は行われてるよ? (もちろんフィールド内の参照が指す先の話じゃなく) それはわかってるつもり 関数定義で引数を参照にしそこねた場合とかをイメージしてた Copyつきだとmoveされずに残るから気づきにくい それで問題なく動いてるならどうでもいいだろ 遅かったら直せば? どれだけ速かろうが、なんら価値を産まないプログラムの価値はゼロだよ 動くのは前提で最初( >>385 )から速度の話をしてるんですよ 流れで所有権の有効性の一面がでてきたわけですがね 他の人はどれくらいの速度低下を許容しているのか知りたいってのが発端 呼び出し規約でレジスタに乗る範囲は意識するかな 大きいのは論外だとして、小さいのは プロファイルとっても表面化しないまま積み重なっていくだけだから 遅かったらあとで直すってのはまず実施されないよね 価値を生まないプログラムの価値はゼロ とかいうひどい重言 >>399 しつこくてごめんね、でも分かってるようには思えないなぁ CopyだろうがMoveだろうがメモリの使用量も速度も何も変わらないよ? >>391 に書いてあるけど複製前の値が使えるか使えないかっていう、所有権の違いだけ 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. CopyとMoveの違いはassign後のxにアクセスできるか出来ないかの違いしかない 内部的にはどちらもビット単位のコピーが行われる When should my type be Copy? Generally speaking, if your type can implement Copy, it should. Keep in mind, though, that implementing Copy is part of the public API of your type. If the type might become non-Copy in the future, it could be prudent to omit the Copy implementation now, to avoid a breaking API change. 一般的にCopyが実装可能ならするべき 将来的に非Copyになる予定ならAPIが変わることになるので実装しないべき moveのmemcpy()って最適化でだいたい消えるんじゃないの? >>405 だからcopyもmoveもしたくないんですよ 勝手にcopyを渡されるのでなく参照を渡してアクセスすべきstructのサイズがありますよね copy vs move でなく copy/move vs 参照 ということ 勝手にcopyされないようにCopyを実装しないサイズについて 他の人の考えを聞きたかったんです たぶん >>393 にそんな感じって書いたのが良くなかったんだろうな >>392 の問題点を指摘するべきでした >>382 X.orgとWin32はいいとしてCocoaが厄介だな 128bitくらいまでならコピーでいいんじゃね ttps://www.forrestthewoods.com/blog/should-small-rust-structs-be-passed-by-copy-or-by-borrow/ although this is sometimes optimized away. の部分も訳してよ じょぶじょぶ〜 とりま、場合によっては最適化されるっしょ moveでも何かコピーされるの知らんかった。どうしてなの? このレベルの高速化が必要な処理なら #[inline] つけたら >>412 大抵は最適化でコピー省略だろうけど 寿命の短い変数から長い変数へmoveする場合は面倒な予感 め、memmove()はmemcpy()、、 moveが真にmoveになるのはハンドルや参照やFATで指し示されたブツだけなのではないか bittableなオブジェクトでcopyメソッドの付加をケチっても仕方が無い bittableなコピーは所有権フリーでふつくしい >>413 今や言語を超えてもLTO出来るので#[inline]を付ける意味ないんじゃないかな ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.5 2024/06/08 Walang Kapalit ★ | Donguri System Team 5ちゃんねる