公式
https://www.rust-lang.org/
https://blog.rust-lang.org/
https://github.com/rust-lang/rust
公式ドキュメント
https://www.rust-lang.org/learn
Web上の実行環境
https://play.rust-lang.org
※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/
※次スレは原則>>980が立てること
前スレ
Rust part36
https://mevius.5ch.io/test/read.cgi/tech/1779974768/
ワッチョイスレ
プログラミング言語 Rust 4【ワッチョイ】
https://mevius.5ch.io/test/read.cgi/tech/1514107621/
Rust part37
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2026/07/17(金) 19:12:31.24ID:yl11920u797デフォルトの名無しさん
2026/07/22(水) 00:01:05.24ID:MCYwDp1k 今日も逃げるチャンスですね、ID:2WiNYKUyさん
798デフォルトの名無しさん
2026/07/22(水) 00:01:58.91ID:bNcZ+xby799デフォルトの名無しさん
2026/07/22(水) 00:03:54.54ID:l09dx9EB Rustにおける配列は基本スタック領域に置かれるし、Vecはヒープ領域に確保される
これは常識中の常識なんだが、あそこまでイキってる奴が知らんのかw
これは常識中の常識なんだが、あそこまでイキってる奴が知らんのかw
800デフォルトの名無しさん
2026/07/22(水) 00:04:02.26ID:Ka9c4UTc 寝るにゃん
こうひとこと言っておけば大丈夫
こうひとこと言っておけば大丈夫
801デフォルトの名無しさん
2026/07/22(水) 00:05:23.64ID:cO1obK37 自分で引用した文章も読めないのは流石に笑った
802デフォルトの名無しさん
2026/07/22(水) 00:05:42.41ID:/BWr+zSa >>798
ヒープ領域をコピーしていないのにディープコピーと書いてるから違和感ある
ヒープ領域をコピーしていないのにディープコピーと書いてるから違和感ある
803デフォルトの名無しさん
2026/07/22(水) 00:08:11.55ID:hBWpKZVl >>802
勝手に違和感持ってろ
そんな定義は一切ないし、普通に巨大なデータを引き回さないで参照を使う理由にディープコピーを避けるというのはあるってだけ
お前の知識がないことと事実がないことは異なるだけ
勝手に違和感持ってろ
そんな定義は一切ないし、普通に巨大なデータを引き回さないで参照を使う理由にディープコピーを避けるというのはあるってだけ
お前の知識がないことと事実がないことは異なるだけ
804デフォルトの名無しさん
2026/07/22(水) 00:08:37.24ID:YKpwIP/3 自分の知らないことはないと思ってるのはバカの特徴だよね
805デフォルトの名無しさん
2026/07/22(水) 00:09:22.30ID:Jx50pW2v ポインタで指してる先がコピーされるとディープコピーだよね
>>671はディープコピーとは違うよ
>>671はディープコピーとは違うよ
806デフォルトの名無しさん
2026/07/22(水) 00:14:10.47ID:0PjCe+i4807デフォルトの名無しさん
2026/07/22(水) 00:15:13.30ID:0PjCe+i4 データごと丸ごとコピーして実体を複製する行いはディープコピーです
これが一番一般的な定義です
プリミティブ型ならシャロ―コピーとディープコピーは一致します
これが一番一般的な定義です
プリミティブ型ならシャロ―コピーとディープコピーは一致します
808デフォルトの名無しさん
2026/07/22(水) 00:16:59.55ID:VYV3iZui >>671が言ってるのはスタック領域の巨大データの話なので、データごと丸ごとコピーして実体を複製する行いなのでディープコピーだし、プリミティブ型でもなければポインタを渡すことでも解決できないのでシャローコピーでもない、ヒープで .clone() を使うよりはOSのコールがない分速いだけのディープコピーです
809デフォルトの名無しさん
2026/07/22(水) 00:18:33.47ID:yr5TLezq >>806
ヒープ領域を持つ任意の型でclone()できるとそれがRustにおけるディープコピー
ヒープ領域を持つ任意の型でclone()できるとそれがRustにおけるディープコピー
810デフォルトの名無しさん
2026/07/22(水) 00:19:37.59ID:oj722HcK そもそもディープコピーはヒープだけとかどこのアホが言い出したんだろうな
Rustでは巨大なデータをスタックに置く文化がほとんどないから普段スタックでディープコピーを問題にすることはないけど、巨大なデータをスタックに置けばディープコピーは普通に問題になる
CやC++ではヒープの確保が重いのは知られてるけど、意外とスタック上の構造体のディープコピーが安易に使われてる、と定期的に話題にもなるし
Rustでは巨大なデータをスタックに置く文化がほとんどないから普段スタックでディープコピーを問題にすることはないけど、巨大なデータをスタックに置けばディープコピーは普通に問題になる
CやC++ではヒープの確保が重いのは知られてるけど、意外とスタック上の構造体のディープコピーが安易に使われてる、と定期的に話題にもなるし
811デフォルトの名無しさん
2026/07/22(水) 00:20:21.35ID:oj722HcK >>809
そんな定義はお前の頭の中にしかないけど勝手にそう思ってればw
そんな定義はお前の頭の中にしかないけど勝手にそう思ってればw
812デフォルトの名無しさん
2026/07/22(水) 00:21:21.41ID:yr5TLezq813デフォルトの名無しさん
2026/07/22(水) 00:22:43.54ID:yLaC1azO そもそもスタック領域の値を戻す時にコピーは発生し得ないと力説してた奴だからなあ
スタック上の構造体のディープコピーを安易に使う側なんだろ
スタック上の構造体のディープコピーを安易に使う側なんだろ
814デフォルトの名無しさん
2026/07/22(水) 00:23:15.66ID:4HblP/Gz >>812
そうだが……
そうだが……
815デフォルトの名無しさん
2026/07/22(水) 00:23:55.18ID:L1sn8Brj なんでこのスレの単発異様に殺気立ってるの?
816デフォルトの名無しさん
2026/07/22(水) 00:24:20.54ID:4HblP/Gz Deep copy (ディープコピー) - 用語集 | MDN
https://developer.mozilla.org/ja/docs/Glossary/Deep_copy
> プロパティがすべてプリミティブ値であるオブジェクトのコピーは、ディープコピーとシャローコピーの両方の定義に当てはまります。しかし、このようなコピーの深さについて話すのはやや無意味です。というのも、このコピーには入れ子プロパティがなく、ディープコピーについては通常、入れ子プロパティを変更するコンテキストで話すからです。
はっきり書いてますね
https://developer.mozilla.org/ja/docs/Glossary/Deep_copy
> プロパティがすべてプリミティブ値であるオブジェクトのコピーは、ディープコピーとシャローコピーの両方の定義に当てはまります。しかし、このようなコピーの深さについて話すのはやや無意味です。というのも、このコピーには入れ子プロパティがなく、ディープコピーについては通常、入れ子プロパティを変更するコンテキストで話すからです。
はっきり書いてますね
817デフォルトの名無しさん
2026/07/22(水) 00:25:03.62ID:4HblP/Gz >>815
そこの無茶苦茶な主張してる奴がもうこのスレで300以上は確実に書きこんでる荒らしだからだぞ
そこの無茶苦茶な主張してる奴がもうこのスレで300以上は確実に書きこんでる荒らしだからだぞ
818デフォルトの名無しさん
2026/07/22(水) 00:25:16.50ID:xdLXSwNC [i32; 2]がディープコピーではないのはわかるけど
[i32; 20]だとディープコピーなのかな?
サイズで変わるのはやっぱなんか変だよね
サイズが大きいとディープコピーは変
[i32; 20]だとディープコピーなのかな?
サイズで変わるのはやっぱなんか変だよね
サイズが大きいとディープコピーは変
819デフォルトの名無しさん
2026/07/22(水) 00:25:38.81ID:L1sn8Brj >>817
なんでそれで単発が殺気立つの?
なんでそれで単発が殺気立つの?
820デフォルトの名無しさん
2026/07/22(水) 00:26:17.20ID:LylUcC8d821デフォルトの名無しさん
2026/07/22(水) 00:26:54.66ID:PntR9YqK822デフォルトの名無しさん
2026/07/22(水) 00:28:20.94ID:xdLXSwNC i32とラッパー型X(i32)はどうなの
derive Copyしてもラッパー型はディープコピー??
derive Copyしてもラッパー型はディープコピー??
823デフォルトの名無しさん
2026/07/22(水) 00:28:46.52ID:PntR9YqK >>818
Deep copy (ディープコピー) - 用語集 | MDN
https://developer.mozilla.org/ja/docs/Glossary/Deep_copy
> プロパティがすべてプリミティブ値であるオブジェクトのコピーは、ディープコピーとシャローコピーの両方の定義に当てはまります。しかし、このようなコピーの深さについて話すのはやや無意味です。というのも、このコピーには入れ子プロパティがなく、ディープコピーについては通常、入れ子プロパティを変更するコンテキストで話すからです。
ここにも書いてるけど、どれだけ小さくてもデータごと丸ごとコピーして実体を複製する行いはディープコピー
ただ、それが問題になるのは大きなデータの時だけですよって話だ
Deep copy (ディープコピー) - 用語集 | MDN
https://developer.mozilla.org/ja/docs/Glossary/Deep_copy
> プロパティがすべてプリミティブ値であるオブジェクトのコピーは、ディープコピーとシャローコピーの両方の定義に当てはまります。しかし、このようなコピーの深さについて話すのはやや無意味です。というのも、このコピーには入れ子プロパティがなく、ディープコピーについては通常、入れ子プロパティを変更するコンテキストで話すからです。
ここにも書いてるけど、どれだけ小さくてもデータごと丸ごとコピーして実体を複製する行いはディープコピー
ただ、それが問題になるのは大きなデータの時だけですよって話だ
824デフォルトの名無しさん
2026/07/22(水) 00:29:33.48ID:PntR9YqK825デフォルトの名無しさん
2026/07/22(水) 00:31:06.33ID:xdLXSwNC スタックにあるi32をコピーするとディープコピーはちょっと違和感あるかな~
826デフォルトの名無しさん
2026/07/22(水) 00:31:45.29ID:PntR9YqK827sage
2026/07/22(水) 00:32:26.03ID:cmrJLzza ###まとめ
「ヒープ=ディープコピー、スタック=シャローコピー(または単なる代入)」という誤解は、「スタックにある変数はプリミティブか、ポインタサイズのものばかり」という暗黙の前提(あるいは特定の高水準言語の仕様)に囚われているからこそ生まれるものですね。メモリがスタックであろうとヒープであろうと、実体を伴う構造の複製を行えば、それは立派なディープコピーであり、コストの議論の対象になります。
「ヒープ=ディープコピー、スタック=シャローコピー(または単なる代入)」という誤解は、「スタックにある変数はプリミティブか、ポインタサイズのものばかり」という暗黙の前提(あるいは特定の高水準言語の仕様)に囚われているからこそ生まれるものですね。メモリがスタックであろうとヒープであろうと、実体を伴う構造の複製を行えば、それは立派なディープコピーであり、コストの議論の対象になります。
828デフォルトの名無しさん
2026/07/22(水) 00:32:43.32ID:xdLXSwNC ひっかけなぞなぞみたい
829デフォルトの名無しさん
2026/07/22(水) 00:32:52.81ID:L1sn8Brj #[derive(Clone, Copy)]
struct X<'a, T>(&'a T);
がスタックにあったとして、スタックにあるものをコピーすればディープコピーなんだ
へえ〜
struct X<'a, T>(&'a T);
がスタックにあったとして、スタックにあるものをコピーすればディープコピーなんだ
へえ〜
830デフォルトの名無しさん
2026/07/22(水) 00:33:02.34ID:PntR9YqK その上で大きなデータのディープコピーが問題になるのは、単純にそれを全部移し替えないといけないから遅いしメモリの無駄って話だね
RustはC/C++同様低レイヤの言語だから、一般にプログラマはそのあたりのことを考えることが多い
RustはC/C++同様低レイヤの言語だから、一般にプログラマはそのあたりのことを考えることが多い
831デフォルトの名無しさん
2026/07/22(水) 00:35:11.20ID:xdLXSwNC >>829
たしかにディープコピーとは言い難いかも
たしかにディープコピーとは言い難いかも
832デフォルトの名無しさん
2026/07/22(水) 00:35:22.70ID:d6JHHVBS スタック領域においてしまうと、戻り値でムーブする時にもこのディープコピーが発生してしまう(単純なケースであればコンパイラによる最適化で解消可能)
なぜなら、関数やスコープは開始時にスタックを積み上げて終了時にスタックを戻すからで、この中から外にムーブさせるとなるとアドレスを渡して済む問題ではなくなってしまう
これはスタックで実装されている場合に限った話だけど、基本的にはスタックで実装されているからね
なぜなら、関数やスコープは開始時にスタックを積み上げて終了時にスタックを戻すからで、この中から外にムーブさせるとなるとアドレスを渡して済む問題ではなくなってしまう
これはスタックで実装されている場合に限った話だけど、基本的にはスタックで実装されているからね
833デフォルトの名無しさん
2026/07/22(水) 00:36:20.23ID:d6JHHVBS834デフォルトの名無しさん
2026/07/22(水) 00:36:59.37ID:xdLXSwNC >>829
イメージとしてはTをコピーするとディープコピーかな
イメージとしてはTをコピーするとディープコピーかな
835デフォルトの名無しさん
2026/07/22(水) 00:37:32.30ID:d6JHHVBS >>832の続き
これに対して、ヒープ領域においておけばスタックに置かれているのはその領域の管理構造体だけなので、ムーブする時は無条件にこれだけコピーすればいい
これはシャローコピーではあるけどディープコピーではない
これに対して、ヒープ領域においておけばスタックに置かれているのはその領域の管理構造体だけなので、ムーブする時は無条件にこれだけコピーすればいい
これはシャローコピーではあるけどディープコピーではない
836デフォルトの名無しさん
2026/07/22(水) 00:38:56.38ID:d6JHHVBS なので同じ大きなデータをスタックとヒープに置いた時、ムーブで戻り値として返す場合はヒープに置く方がコピーするものが少なく、動作が高速になる
837デフォルトの名無しさん
2026/07/22(水) 00:42:33.61ID:blalnmjp838デフォルトの名無しさん
2026/07/22(水) 00:43:45.85ID:blalnmjp839デフォルトの名無しさん
2026/07/22(水) 00:48:25.38ID:iwo7j10o >>823-824, >>826-827,
>>830, >>832,
あとは>>835-836あたりに散ってしまっているからわかりにくいけど、要するに
* ディープコピーはデータ自体を含めて丸ごとコピーして実体を複製する行い
* どれだけ小さくてもスタック領域でも関係なくディープコピーになる
* ただし大きいデータの場合しか問題にはならないので、小さいデータに使うことはない
* 大きいデータの場合、借用(参照)やヒープ領域上のデータのムーブ、スタックを積み上げる時(スコープに入る時)のスタック領域上のデータのムーブは速いが、スタック領域上のデータの.clone()やスタックを戻す時のスタック領域上のデータのムーブはディープコピーになるので遅く(最適化で改善される場合アリ)、ヒープ領域上のデータの.clone()はシステムコールがあるのでそれよりはるかに遅い
こんな感じか
>>830, >>832,
あとは>>835-836あたりに散ってしまっているからわかりにくいけど、要するに
* ディープコピーはデータ自体を含めて丸ごとコピーして実体を複製する行い
* どれだけ小さくてもスタック領域でも関係なくディープコピーになる
* ただし大きいデータの場合しか問題にはならないので、小さいデータに使うことはない
* 大きいデータの場合、借用(参照)やヒープ領域上のデータのムーブ、スタックを積み上げる時(スコープに入る時)のスタック領域上のデータのムーブは速いが、スタック領域上のデータの.clone()やスタックを戻す時のスタック領域上のデータのムーブはディープコピーになるので遅く(最適化で改善される場合アリ)、ヒープ領域上のデータの.clone()はシステムコールがあるのでそれよりはるかに遅い
こんな感じか
840デフォルトの名無しさん
2026/07/22(水) 00:48:38.10ID:blalnmjp つまり、実体をヒープ領域に置いたほうが優れている、は間違いというか錯覚
841デフォルトの名無しさん
2026/07/22(水) 00:49:52.70ID:MXbcRWOz842デフォルトの名無しさん
2026/07/22(水) 00:50:38.19ID:OQXWNcQK843デフォルトの名無しさん
2026/07/22(水) 00:51:42.02ID:bjO+R+mh844デフォルトの名無しさん
2026/07/22(水) 00:52:32.07ID:blalnmjp845デフォルトの名無しさん
2026/07/22(水) 00:55:39.54ID:bjO+R+mh スタックはデータを後入れ先出しで保持するデータ構造で、スタック領域では通常これをスコープ(関数を含む)に入る時にプッシュし、スコープを抜ける時にポップする
つまりスコープに入る時にそのスタック領域で必要なメモリを確保して、スコープを抜ける時にそれをそのまま巻き戻すことで解放を行っている
なので、内側のスコープで生成したデータを外側のスコープに与える時にはコピーしなくてはならなくなる
つまりスコープに入る時にそのスタック領域で必要なメモリを確保して、スコープを抜ける時にそれをそのまま巻き戻すことで解放を行っている
なので、内側のスコープで生成したデータを外側のスコープに与える時にはコピーしなくてはならなくなる
846デフォルトの名無しさん
2026/07/22(水) 00:58:01.43ID:blalnmjp >>845
そこは静的に判っているからReturn Value Optimizationできそう
そこは静的に判っているからReturn Value Optimizationできそう
847デフォルトの名無しさん
2026/07/22(水) 00:59:07.03ID:DeO+WrPt >>844
まあ単純に戻す場合は最適化できるだろうけど、複雑なデータのやり取りがある場合は必ずしも既存のパターンだけで最適化できないことはある
最初からヒープ領域にデータを置いて管理構造体だけを移すムーブにすると、確実にシャロ―コピーとなることが保障されるので最適化頼みの賭けにならずに済む
まあ単純に戻す場合は最適化できるだろうけど、複雑なデータのやり取りがある場合は必ずしも既存のパターンだけで最適化できないことはある
最初からヒープ領域にデータを置いて管理構造体だけを移すムーブにすると、確実にシャロ―コピーとなることが保障されるので最適化頼みの賭けにならずに済む
848デフォルトの名無しさん
2026/07/22(水) 01:06:02.68ID:L1sn8Brj スタック巻き戻しってそういうことじゃないです
849デフォルトの名無しさん
2026/07/22(水) 01:08:33.80ID:iL1PKXjH また根拠のない否定か
もうみんな飽きてるよそれ
もうみんな飽きてるよそれ
850デフォルトの名無しさん
2026/07/22(水) 01:10:07.59ID:blalnmjp >>847
そこの最適化はRustなら大丈夫だと思う
戻値が16バイトまでならレジスタ2つで返すけど
それを超えると関数呼び出し元のスタックフレームに戻値の領域を確保してそのアドレスをレジスタリストの第一引数として渡すABIになってる
呼ばれた下の関数はその渡されたアドレスに戻値を書き込むRust ABI
そこの最適化はRustなら大丈夫だと思う
戻値が16バイトまでならレジスタ2つで返すけど
それを超えると関数呼び出し元のスタックフレームに戻値の領域を確保してそのアドレスをレジスタリストの第一引数として渡すABIになってる
呼ばれた下の関数はその渡されたアドレスに戻値を書き込むRust ABI
851デフォルトの名無しさん
2026/07/22(水) 01:15:29.52ID:o2cM4ZXa 必ずそうなるってわけではないからねえ
それだと不都合なこともあり得るし、アーキテクチャによっても最終的には変わってくるだろう
それだと不都合なこともあり得るし、アーキテクチャによっても最終的には変わってくるだろう
852デフォルトの名無しさん
2026/07/22(水) 01:19:39.84ID:blalnmjp853デフォルトの名無しさん
2026/07/22(水) 01:24:30.85ID:oB+DESr1 >>852
ライブラリは無駄があっても互換性優先だけど、全関数がそうかは別の問題
ライブラリは無駄があっても互換性優先だけど、全関数がそうかは別の問題
854デフォルトの名無しさん
2026/07/22(水) 01:27:55.98ID:blalnmjp >>853
動的リンクライブラリ以外の関数は静的にリンクだからもっと安心だと思うよ
動的リンクライブラリ以外の関数は静的にリンクだからもっと安心だと思うよ
855デフォルトの名無しさん
2026/07/22(水) 01:38:42.52ID:hheEkfdk >>854
また動くかどうかの話になってるけど、そんな話はしてないという
また動くかどうかの話になってるけど、そんな話はしてないという
856デフォルトの名無しさん
2026/07/22(水) 04:57:35.83ID:XaGJSnmH こんなにスレ伸ばしたって読まねぇぞ
857デフォルトの名無しさん
2026/07/22(水) 05:12:55.66ID:H8x9U9EL deep copyとshallow copyは2種類の異なるcopy方法が考えられる時にのみ
その使い分けに用いられる用語
1種類しかない時に用いたら失格
その使い分けに用いられる用語
1種類しかない時に用いたら失格
858デフォルトの名無しさん
2026/07/22(水) 07:28:52.11ID:bm8B9/Z+ 夏休みは海とか山とか友達なんかと遊びに行きなよ
人付き合いはできて困る事はないぞ多分
人付き合いはできて困る事はないぞ多分
859デフォルトの名無しさん
2026/07/22(水) 10:18:10.68ID:qLhff68A 仮に111レスしてるおじが本人の言う通り自演してないとしても
もう一人の無限湧きの単発のおじが自演ってだけだから、結局二人でずっとまったく成立してない会話してるんだよね
OpenClawでやってるにしろ人力にしろ、本当に海か山でも行ったほうがいいと思う
もう一人の無限湧きの単発のおじが自演ってだけだから、結局二人でずっとまったく成立してない会話してるんだよね
OpenClawでやってるにしろ人力にしろ、本当に海か山でも行ったほうがいいと思う
860デフォルトの名無しさん
2026/07/22(水) 12:08:53.98ID:d19KA9Tj 音大出身の女性がITディレクターやってたらしいんだが、あり得るの?
年収は600万
https://lavender.5ch.io/test/read.cgi/karaok/1784604629/625
年収は600万
https://lavender.5ch.io/test/read.cgi/karaok/1784604629/625
861デフォルトの名無しさん
2026/07/22(水) 12:10:09.72ID:d19KA9Tj 625 選曲してください sage 2026/07/22(水) 00:11:47.96 ID:5DADgvY5
>>608
その会社は入社1年目
そのままクライアント会社(上場)に新設されたWEB事業部に出向→移籍、社長プレゼン
我ながら特殊な経験をしてると思うよ
まだWEB専門卒の人とかも少ないし素人が現場で仕事を覚えていける時代だったから、今ではあり得ないやろね
紙媒体からWEBに移行した人も多くて、得体の知れない業界人がウヨウヨいた
>>608
その会社は入社1年目
そのままクライアント会社(上場)に新設されたWEB事業部に出向→移籍、社長プレゼン
我ながら特殊な経験をしてると思うよ
まだWEB専門卒の人とかも少ないし素人が現場で仕事を覚えていける時代だったから、今ではあり得ないやろね
紙媒体からWEBに移行した人も多くて、得体の知れない業界人がウヨウヨいた
862デフォルトの名無しさん
2026/07/22(水) 13:14:32.22ID:5C0qO59L 普通によくある構造体struct Xxx { ... }を生成する関数
impl Xxx {
fn new( ... ) -> Self {
...
}
}
fn foo {
let x = Xxx::new( ... );
}
これはもちろんこの関数new()の中で生成したXxx型の値が呼び出し元の関数foo()にある変数xへムーブされる
Rustの抽象概念としてはここまで
ムーブが現実にはどのように実現されているかを知ることなくRustのプログラミングができる
impl Xxx {
fn new( ... ) -> Self {
...
}
}
fn foo {
let x = Xxx::new( ... );
}
これはもちろんこの関数new()の中で生成したXxx型の値が呼び出し元の関数foo()にある変数xへムーブされる
Rustの抽象概念としてはここまで
ムーブが現実にはどのように実現されているかを知ることなくRustのプログラミングができる
863デフォルトの名無しさん
2026/07/22(水) 13:18:55.70ID:5C0qO59L Rustの抽象概念ムーブがどのように機械語で実装されるのか?
それがRustの高速性を決めている
普通によくあるx86-64bitのLinux環境で関数が値を返すときのムーブの実装について見てみよう
64bit二つ分までのサイズのデータを関数が返す時は64bitレジスタraxとrdxに入れて返す
しかし>>862の構造体Xxxのサイズがその128bit (=16byte)を超えていてレジスタ返しができない場合はどうなるだろう?
Rustでは関数f()でのデータ受け取り変数xのアドレスを隠れた引数として関数new()へレジスタ渡しする
new()ではそのアドレスへ直接データを書き込んでXxx構造体を作っていく
関数が多段で孫関数からXxxを返す場合でも子関数から孫関数へ隠れた引数としてアドレスが同様に渡される
孫関数は祖父関数のスタックフレームへ直接データを書き込むことになる
ムーブは抽象概念に過ぎないため実際にデータを移動(コピー)させる必要はない
最初から最終移動先へデータを書き込むことでRustは無駄なコピーを排除している
それがRustの高速性を決めている
普通によくあるx86-64bitのLinux環境で関数が値を返すときのムーブの実装について見てみよう
64bit二つ分までのサイズのデータを関数が返す時は64bitレジスタraxとrdxに入れて返す
しかし>>862の構造体Xxxのサイズがその128bit (=16byte)を超えていてレジスタ返しができない場合はどうなるだろう?
Rustでは関数f()でのデータ受け取り変数xのアドレスを隠れた引数として関数new()へレジスタ渡しする
new()ではそのアドレスへ直接データを書き込んでXxx構造体を作っていく
関数が多段で孫関数からXxxを返す場合でも子関数から孫関数へ隠れた引数としてアドレスが同様に渡される
孫関数は祖父関数のスタックフレームへ直接データを書き込むことになる
ムーブは抽象概念に過ぎないため実際にデータを移動(コピー)させる必要はない
最初から最終移動先へデータを書き込むことでRustは無駄なコピーを排除している
864デフォルトの名無しさん
2026/07/22(水) 13:20:20.48ID:IHEroBD/ 仮に額面通りmoveするんだったらコピーが入るから、効率重視のコードなら回避しないといけないでしょ
つまり最適化を理解する必要があるわけで、
> ムーブが現実にはどのように実現されているかを知ることなくRustのプログラミングができる
は誤りということになる
つまり最適化を理解する必要があるわけで、
> ムーブが現実にはどのように実現されているかを知ることなくRustのプログラミングができる
は誤りということになる
865デフォルトの名無しさん
2026/07/22(水) 14:07:07.48ID:P03AutQj ムーブという魔法でRustは上手いことやってくれるという抽象レベルの理解も重要
そのムーブ魔法がどう実現されているか知っておくことも重要
そのムーブ魔法がどう実現されているか知っておくことも重要
866デフォルトの名無しさん
2026/07/22(水) 14:35:10.94ID:YIjqgtY0 魔法を信じてプログラミングしても大丈夫だよ
もし遅いと感じたら測定する
ムーブの最適化が何らかの事情でできてなければ判明してそこで初めて対処すればいいんだよ
万が一に備えて最初からヒープ領域にデータを置くことは間違った早すぎる最適化であり愚かな行為
もし遅いと感じたら測定する
ムーブの最適化が何らかの事情でできてなければ判明してそこで初めて対処すればいいんだよ
万が一に備えて最初からヒープ領域にデータを置くことは間違った早すぎる最適化であり愚かな行為
867デフォルトの名無しさん
2026/07/22(水) 15:37:11.70ID:9kaHeq4d868デフォルトの名無しさん
2026/07/22(水) 15:38:48.11ID:6Gra50HL869デフォルトの名無しさん
2026/07/22(水) 15:41:08.01ID:8n0waISf >>863
値を返す時に必ずそうなるという主張はコンパイラを単純に考えすぎているし、そもそも出力されるアセンブリ言語や機械語はそのバージョンのコンパイラの解析能力で扱える範囲で最適化されるにすぎないことは知っておく必要がある
値を返す時に必ずそうなるという主張はコンパイラを単純に考えすぎているし、そもそも出力されるアセンブリ言語や機械語はそのバージョンのコンパイラの解析能力で扱える範囲で最適化されるにすぎないことは知っておく必要がある
870デフォルトの名無しさん
2026/07/22(水) 15:42:53.59ID:9kaHeq4d871デフォルトの名無しさん
2026/07/22(水) 15:44:31.94ID:JycBCTuD >>866
そもそもスタックに巨大データを置くことが誤った設計なんですけど
そもそもスタックに巨大データを置くことが誤った設計なんですけど
872デフォルトの名無しさん
2026/07/22(水) 15:49:37.99ID:n22ahHSU 旧来からの発想の転換で有利なスタック領域を活用することがRustの高速化に繋がった
873デフォルトの名無しさん
2026/07/22(水) 15:50:52.67ID:fqsfiDCR 流石に嘘すぎる
何のためにRustがヒープを安全に扱える仕組みを導入したのか完全に無視している
何のためにRustがヒープを安全に扱える仕組みを導入したのか完全に無視している
874デフォルトの名無しさん
2026/07/22(水) 15:53:09.53ID:fqsfiDCR スタック領域が有利なのは特定の条件下(確保/解放が多い、扱うデータが小さくコピーが起きても支障がない、決定論的な動作が必要でシステムコールが待てない)だけで、大きなデータを扱う場合には普通にヒープに置いた方が使い勝手はいい
875デフォルトの名無しさん
2026/07/22(水) 15:57:07.11ID:O01J+ZaE >>872
Rustが高速な理由は無駄な処理をしない、遅い処理を排除することに注力し、かつ言語仕様を厳格化することで最適化しやすいヒントを多く含むIRを生成して、LLVMに渡せるようにすることで実現されている
ヒープ領域はむしろ積極的に活用されている(たとえば、VecやStringはヒープの確保を伴う)し、スタックに大きなデータを置かないことを推奨してもいる
Rustが高速な理由は無駄な処理をしない、遅い処理を排除することに注力し、かつ言語仕様を厳格化することで最適化しやすいヒントを多く含むIRを生成して、LLVMに渡せるようにすることで実現されている
ヒープ領域はむしろ積極的に活用されている(たとえば、VecやStringはヒープの確保を伴う)し、スタックに大きなデータを置かないことを推奨してもいる
876デフォルトの名無しさん
2026/07/22(水) 16:01:13.48ID:nRzhKxoM Rc/Arcはヒープ領域を管轄するからこそ実現できる例のようにヒープ領域の利用は意味があるよ
基本はスタック領域を活用
必要に応じてヒープ領域
基本はスタック領域を活用
必要に応じてヒープ領域
877デフォルトの名無しさん
2026/07/22(水) 16:04:22.62ID:JKcxJ34H878デフォルトの名無しさん
2026/07/22(水) 16:10:10.68ID:Of/BcPgB879デフォルトの名無しさん
2026/07/22(水) 16:25:45.26ID:XYz54jbC880デフォルトの名無しさん
2026/07/22(水) 16:31:09.68ID:c7srhqru881デフォルトの名無しさん
2026/07/22(水) 16:59:58.86ID:Z37YkZf/ 言い争ってる内容のレベルが日々下がってくね
882デフォルトの名無しさん
2026/07/22(水) 17:15:11.12ID:XYz54jbC883デフォルトの名無しさん
2026/07/22(水) 17:16:51.37ID:XYz54jbC >>881
Rustろくに書いたことないのにゼロヒャクで断言したがる奴が多すぎるんだよな
Rustろくに書いたことないのにゼロヒャクで断言したがる奴が多すぎるんだよな
884デフォルトの名無しさん
2026/07/22(水) 17:22:27.60ID:XYz54jbC >>879の補足
CPUのキャッシュはヒープ領域のデータでも使用頻度が高ければキャッシュするので、スタック領域かヒープ領域かは関係がない
そのためにキャッシュラインに合わせてアラインメントしてヒープ領域を使うということも行われる
また、スタック領域に置かれていてもアラインメントがされていなければキャッシュ効率が悪くなることも普通にある
CPUのキャッシュはヒープ領域のデータでも使用頻度が高ければキャッシュするので、スタック領域かヒープ領域かは関係がない
そのためにキャッシュラインに合わせてアラインメントしてヒープ領域を使うということも行われる
また、スタック領域に置かれていてもアラインメントがされていなければキャッシュ効率が悪くなることも普通にある
885デフォルトの名無しさん
2026/07/22(水) 22:43:51.19ID:o2Jdm9L+ メモリ空間をOSが管理してると、ヒープ領域を使うのにいちいちシステムコールが必要になるから、欠点が目立つんだよな
でもスタック領域に欠点がないかと言えば、別にそんなこともないから使い分けが必要
でもスタック領域に欠点がないかと言えば、別にそんなこともないから使い分けが必要
886デフォルトの名無しさん
2026/07/22(水) 23:14:46.59ID:WzrqCFod >>879
スタック上で処理したほうが圧倒的に有利になっている理由は、他のローカル変数はスタック上にあり、関数呼び出し時もスタックを用いるため
メモリの使用範囲がスタック上のみに限定され、メモリキャッシュ効果が最大限に発揮されます
スタック上で処理したほうが圧倒的に有利になっている理由は、他のローカル変数はスタック上にあり、関数呼び出し時もスタックを用いるため
メモリの使用範囲がスタック上のみに限定され、メモリキャッシュ効果が最大限に発揮されます
887デフォルトの名無しさん
2026/07/23(木) 02:50:21.49ID:luqj8bdN >>886
そもそもスタック領域を大きくしたらスタック全体がキャッシュに乗らなくなるし、ヒープでも確保を工夫すればキャッシュに乗せられるので、ほとんど関係がない
そもそもスタック領域を大きくしたらスタック全体がキャッシュに乗らなくなるし、ヒープでも確保を工夫すればキャッシュに乗せられるので、ほとんど関係がない
888デフォルトの名無しさん
2026/07/23(木) 03:28:47.44ID:0/IAmlr6889デフォルトの名無しさん
2026/07/23(木) 07:58:46.98ID:rkdmRmzF 仮に (あくまでも仮に) スタックの多用が全面的にメリットばかりだとしてもたとえば Linux のデフォルトだとスタックの上限はたった 8MB だぞ。
上限を引き上げる設定をやったことなんてほとんどないだろ。みんなスタック 8MB でやりくりしてるんだよ。
上限を引き上げる設定をやったことなんてほとんどないだろ。みんなスタック 8MB でやりくりしてるんだよ。
890デフォルトの名無しさん
2026/07/23(木) 08:13:33.16ID:AUDDS2Ak > スタックの多用が全面的にメリットばかり
正にこれが間違い
ヒープ領域に確保する方が関係データを含めてアクセスローカリティを考慮したデータレイアウト設計が出来る
正にこれが間違い
ヒープ領域に確保する方が関係データを含めてアクセスローカリティを考慮したデータレイアウト設計が出来る
891デフォルトの名無しさん
2026/07/23(木) 08:19:49.70ID:z4+uszs5 組み込みだとスタックが浅いからって
関数呼び出しはするな
引数も使うな
全部グローバルでやりとりしろ
みたいな流儀があったらしいと聞くが
なんでそういう絶対的な制約があるわけでもないのに似たような縛りプレイやろうとしてるんだろう
関数呼び出しはするな
引数も使うな
全部グローバルでやりとりしろ
みたいな流儀があったらしいと聞くが
なんでそういう絶対的な制約があるわけでもないのに似たような縛りプレイやろうとしてるんだろう
892デフォルトの名無しさん
2026/07/23(木) 11:19:45.15ID:FxkCx1gi >>889
8MBはデフォルト値にすぎないから
起動プロセスのための環境変数を設定するタイミングと同じように
起動直前で例えばulimit -s 65536すれば子プロセスのみスタック領域を64MBに変えることができるよ
8MBはデフォルト値にすぎないから
起動プロセスのための環境変数を設定するタイミングと同じように
起動直前で例えばulimit -s 65536すれば子プロセスのみスタック領域を64MBに変えることができるよ
893デフォルトの名無しさん
2026/07/23(木) 11:33:58.96ID:rkdmRmzF894デフォルトの名無しさん
2026/07/23(木) 11:43:37.14ID:ZelaGfP0 スタック領域サイズだけに限らず諸々のリソースのパラメータは各用途に応じて設定して運用が行われている
895デフォルトの名無しさん
2026/07/23(木) 11:46:07.77ID:1wG4VbX9 Rustってすごい言語なんですね
896デフォルトの名無しさん
2026/07/23(木) 11:47:21.36ID:SaQIv/sp >各用途に応じて設定して運用が行われている
(つまり、各用途に応じた設定をして運用を行ったことはない)
(つまり、各用途に応じた設定をして運用を行ったことはない)
■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 酷すぎる愛知名古屋アジア大会、貧相な食事、小さすぎるベッドに男女同室のミス、国歌も間違えグダグダな運営対応に海外から大ブーイング [征夷大将軍★]
- 【Z世代】「食事キャンセル界隈」は本当に大丈夫なのか? 若者が「食べられない」ことを正当化する“危険性”も [ぐれ★]
- 【滋賀】琵琶湖で男性3人が行方不明 レンタルした水上バイクだけが湖上で見つかる 警察や消防などが捜索 [ぐれ★]
- 【福岡】「裸を撮られた」18歳女子高校生が届け出て発覚 元交際相手の18歳高校生の男「彼氏に動画を見せれば別れて戻ってくると…」 [ぐれ★]
- 【自動車】残クレ650万円で買った「アルファード」わずか8ヶ月で廃車に…まだ残価580万円あるのに全部借金? 相手のいる事故でも? ★2 [ぐれ★]
- 【大阪都構想】「ミャクミャ区」案も 再編の特別区名、大阪維新がアンケ [ぐれ★]
- 【台風25号】960hPaで、間もなく最接近!雨のピークは越えたか?!今回もギリ、千葉は耐えた模様。高市タイフーン [219241683]
- 【高市悲報】千葉県の小糸川が氾濫、試される半島🥹 [616817505]
- すまん、「オルカン」とか「S&P500」って意味なくないか?老人になってから金持ちになりたいんじゃない。今すぐ金が欲しいんだ! [838847604]
- トランプ大統領「高市早苗?あいつは私のファンだガハハ」 [931948549]
- 愛用してるボディソープが値上げした😭
- 「ココイチ高すぎる!」に込められた格差社会への怒り…なぜ人は「CoCo壱番屋」に物申したくなるのか [303493227]