探検


Rust part37

レス数が950を超えています。1000を超えると書き込みができなくなります。
1デフォルトの名無しさん
垢版 |
2026/07/17(金) 19:12:31.24ID:yl11920u
公式
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/
2026/07/22(水) 16:04:22.62ID:JKcxJ34H
>>876
> 基本はスタック領域を活用
この時点で嘘なんだよな
Rustはプリミティブ値以外ほとんどヒープに置く
配列よりもVecを使う言語だぞ
2026/07/22(水) 16:10:10.68ID:Of/BcPgB
>>875
スタックに大きなデータを置いても構わない
推奨なんてものはない
例えば全てのデータをスタックに置いてL2キャッシュの恩恵により高速に動かすことなど普通に行われている
2026/07/22(水) 16:25:45.26ID:XYz54jbC
>>878
ダウト
スタックに置くこととL2キャッシュに載ることに関連性はない
2026/07/22(水) 16:31:09.68ID:c7srhqru
>>877
初心者なのかもしれんがRustではスタック上で配列を使うクレートも盛んに使われているぞ
適材適所で使い分けが肝心
2026/07/22(水) 16:59:58.86ID:Z37YkZf/
言い争ってる内容のレベルが日々下がってくね
2026/07/22(水) 17:15:11.12ID:XYz54jbC
>>880
そりゃ機能があるのに全く使われてないと仮定するのは無理があるし、そんなことは言ってないでしょ
「よりも」はゼロヒャクじゃないよ
2026/07/22(水) 17:16:51.37ID:XYz54jbC
>>881
Rustろくに書いたことないのにゼロヒャクで断言したがる奴が多すぎるんだよな
2026/07/22(水) 17:22:27.60ID:XYz54jbC
>>879の補足
CPUのキャッシュはヒープ領域のデータでも使用頻度が高ければキャッシュするので、スタック領域かヒープ領域かは関係がない
そのためにキャッシュラインに合わせてアラインメントしてヒープ領域を使うということも行われる
また、スタック領域に置かれていてもアラインメントがされていなければキャッシュ効率が悪くなることも普通にある
2026/07/22(水) 22:43:51.19ID:o2Jdm9L+
メモリ空間をOSが管理してると、ヒープ領域を使うのにいちいちシステムコールが必要になるから、欠点が目立つんだよな
でもスタック領域に欠点がないかと言えば、別にそんなこともないから使い分けが必要
2026/07/22(水) 23:14:46.59ID:WzrqCFod
>>879
スタック上で処理したほうが圧倒的に有利になっている理由は、他のローカル変数はスタック上にあり、関数呼び出し時もスタックを用いるため
メモリの使用範囲がスタック上のみに限定され、メモリキャッシュ効果が最大限に発揮されます
2026/07/23(木) 02:50:21.49ID:luqj8bdN
>>886
そもそもスタック領域を大きくしたらスタック全体がキャッシュに乗らなくなるし、ヒープでも確保を工夫すればキャッシュに乗せられるので、ほとんど関係がない
888デフォルトの名無しさん
垢版 |
2026/07/23(木) 03:28:47.44ID:0/IAmlr6
>>887
大きさ問題はその両者で中立。
ヒープだけを使うことは不可能だがスタックだけを使うことは可能だから必ずスタックが有利になる。
2026/07/23(木) 07:58:46.98ID:rkdmRmzF
仮に (あくまでも仮に) スタックの多用が全面的にメリットばかりだとしてもたとえば Linux のデフォルトだとスタックの上限はたった 8MB だぞ。
上限を引き上げる設定をやったことなんてほとんどないだろ。みんなスタック 8MB でやりくりしてるんだよ。
2026/07/23(木) 08:13:33.16ID:AUDDS2Ak
> スタックの多用が全面的にメリットばかり
正にこれが間違い

ヒープ領域に確保する方が関係データを含めてアクセスローカリティを考慮したデータレイアウト設計が出来る
2026/07/23(木) 08:19:49.70ID:z4+uszs5
組み込みだとスタックが浅いからって
関数呼び出しはするな
引数も使うな
全部グローバルでやりとりしろ
みたいな流儀があったらしいと聞くが
なんでそういう絶対的な制約があるわけでもないのに似たような縛りプレイやろうとしてるんだろう
892デフォルトの名無しさん
垢版 |
2026/07/23(木) 11:19:45.15ID:FxkCx1gi
>>889
8MBはデフォルト値にすぎないから
起動プロセスのための環境変数を設定するタイミングと同じように
起動直前で例えばulimit -s 65536すれば子プロセスのみスタック領域を64MBに変えることができるよ
2026/07/23(木) 11:33:58.96ID:rkdmRmzF
>>892
デフォルトなのは知ってるからデフォルトって書いてるだろ。
変更できるのは知ってるから、でも変更したことないだろ (それが普通) って話をしてる。
2026/07/23(木) 11:43:37.14ID:ZelaGfP0
スタック領域サイズだけに限らず諸々のリソースのパラメータは各用途に応じて設定して運用が行われている
2026/07/23(木) 11:46:07.77ID:1wG4VbX9
Rustってすごい言語なんですね
2026/07/23(木) 11:47:21.36ID:SaQIv/sp
>各用途に応じて設定して運用が行われている
(つまり、各用途に応じた設定をして運用を行ったことはない)
897デフォルトの名無しさん
垢版 |
2026/07/23(木) 11:55:01.09ID:RmZ5xdy6
>>895
リソースパラメタ変更して運用はRust登場以前から普通に行われている
2026/07/23(木) 13:12:35.86ID:cxrYFfJU
>>890
そもそもスタックが全てキャッシュに乗るわけでも、データが全てキャッシュに乗るわけでもなく、使ったものがキャッシュに乗る
なのでスタックにあるかどうかは関係ないし、そこに固執してるのは知識がないから
2026/07/23(木) 13:13:10.18ID:cxrYFfJU
ごめん、>>888だった
2026/07/23(木) 13:13:53.08ID:cxrYFfJU
複おじの妄想は相手しなくていいよ
2026/07/23(木) 13:16:21.80ID:VXCn4TUk
>>898
スタックは必ず使われるからキャッシュに必ず乗り必ず有利になることは常識
2026/07/23(木) 13:22:40.15ID:cxrYFfJU
>>901
キャッシュはキャッシュラインの単位ごとにしか乗らないので、巨大データをスタックに置いたところで他の変数と一緒にキャッシュに乗ることは保証されない
一方でヒープに置いた場合でも、一度使えばキャッシュに乗るため繰り返し使う時に高速で扱える
2026/07/23(木) 13:23:01.90ID:m8CXPFD8
> 必ず乗り
そんなわけない
2026/07/23(木) 13:25:12.89ID:cxrYFfJU
キャッシュが無限に容量があって無限に高速なメモリだとでも仮定しないと、必ず乗るなんて主張は成立させられないはずなのだが
それにヒープ領域はキャッシュに乗らないと頑なに信じているらしいが、CPU設計者をそこまでバカにする理由もよくわからない
わざわざ大量の計算をしてスタック領域だけを見分けてキャッシュに乗せる、そんな無意味なことをするとなぜ信じられるのだろうか
2026/07/23(木) 13:29:30.30ID:neKzl6rg
レジスタ退避でいつもL1に乗るからスタック上にあるローカル変数は速いよね
2026/07/23(木) 13:30:40.71ID:cxrYFfJU
>>905
いつでもL1に乗るなんてありえない妄想
そもそもL1は8MiBもねえじゃん
2026/07/23(木) 13:57:52.08ID:qk0tjYWL
>>905
レジスタ退避について勘違いしてるよ
2026/07/23(木) 19:14:51.69ID:OLcLF/i1
>>905
シンプルに教えてほしいんだけど、レジスタやL1が8MiBもあるCPUってどこにあるんだい?
909デフォルトの名無しさん
垢版 |
2026/07/23(木) 21:46:09.46ID:vX/zh6w3
topcoatてこれwasmじゃなくてjsに変換するらしいけど普通にjs書いたほうがよくね?
2026/07/23(木) 22:01:21.86ID:1wG4VbX9
人類はいつまでJavaScriptに苦しめられるのでしょうか?
WASMを作った連中に覚悟があれば、今頃はC++でWebアプリを作れたでしょうに
911sage
垢版 |
2026/07/23(木) 22:10:09.90ID:xivhFue3
Rustってハードパワーのゴリ押しみたいな側面もあるんで
そういうこと
912デフォルトの名無しさん
垢版 |
2026/07/23(木) 22:48:38.91ID:oRBJ/Nhk
来年WASMでDOM操作とfetchできるようになるから待ってて
2026/07/23(木) 22:52:01.41ID:IHVi+hDe
フロントエンドはJavaScript側のエコシステムで対応しないと
思ってる以上に早く負債になって失敗、後悔するというのは
これまでもRubyのほうのRailsが散々証明してくれてるからな
914デフォルトの名無しさん
垢版 |
2026/07/23(木) 22:54:25.22ID:vX/zh6w3
てか10日間で設計されたうんこスクリプトをWEBのデファクトにするて人類ガイジすぎやろ
915デフォルトの名無しさん
垢版 |
2026/07/23(木) 23:07:32.79ID:bEDi3eQt
さすがにここまで来たら10日間で作った部分は消え去ってるんじゃねーの
2026/07/23(木) 23:12:44.53ID:T3AzUbLt
>>907
レジスタは明示的にpushしなくてもripなどの命令ポインタはcallすると自動的にスタックに退避されるよ
2026/07/23(木) 23:29:45.68ID:sSI22omN
>>911
そんなわけなくて草
それでCと同じ速度が出るわけねえだろ
2026/07/23(木) 23:36:14.54ID:u5UkAy+5
>>916
関数を呼び出す時にスタックにレジスタの値を退避するというのは、スタックで現在処理中の値やプログラムの実行位置を管理してるからで、呼び出した関数から戻ってくるまでそれらの値をスタックに置いておくということでしかない
呼び出した関数から戻ってきた時にこれらの値をレジスタに戻すことで、同じ位置から処理を再開するというのがこの機能の目的であって、キャッシュとは何も関係がない

また、スタック領域に置かれた変数が全てレジスタに書きこまれているわけではない(それどころか、レジスタは全部合わせても大した数がなく、データ置き場としては使えない)し、スタック領域に置かれた変数が全てキャッシュに乗るといった事実もない(当然ながら、あまり使われなければキャッシュには置かない)
919デフォルトの名無しさん
垢版 |
2026/07/23(木) 23:44:02.18ID:CqZb6B5+
>>918
キャッシュとは何も関係がない?ってアホやな
スタックに退避されるとスタックのその前後はキャッシュに載る
その前後にはローカル変数がいる
だから速さの恩恵を受ける
2026/07/23(木) 23:51:27.31ID:oVCWnmQT
キャッシュに載ってなかったら、キャッシュレス?
2026/07/24(金) 00:05:19.44ID:YdTFtdBW
>>919
> スタックに退避されるとスタックのその前後はキャッシュに載る
> その前後にはローカル変数がいる
> だから速さの恩恵を受ける

複数の誤謬が含まれている

まず第一に、レジスタがスタックに退避される時のキャッシュへの読み込みはキャッシュライン単位でしか行われないので、64バイトを超えた分はキャッシュに読み込まれない
そのため、巨大データをスタックに置くことでキャッシュ上有利に扱えるということは、この時点でなくなっている

次に、実際にはローカル変数だけでなく、戻りアドレスや呼び出し元のフレームポインタ、レジスタが不足した時の退避先などもスタックに置かれるため、実際には64バイトから8バイトのレジスタ分を引いて残りが全てローカル変数、ということにもならない
そのため、そこまで大きくないデータであってもスタックへのレジスタ退避でキャッシュに乗るとは限らない

更に、キャッシュはスタックへのレジスタ退避の時しか行われないわけではない
既に散々書かれているようにしか見えないのだが、スタックだろうがヒープだろうが読み書きすればキャッシュに乗り、使われ続ければ保持されるためスタックへのレジスタ退避とは無関係に、キャッシュの挙動に合わせたデータが有利に速さの恩恵を受ける
そして、スタックとローカル変数はこれに最適化されていない
2026/07/24(金) 00:07:11.57ID:YdTFtdBW
説明もなく64バイトと書いてしまったが、これは一般的なCPUのL1キャッシュで比較的多く採用されている、キャッシュラインの大きさである
2026/07/24(金) 00:51:48.87ID:8ekr92pQ
> キャッシュはスタックへのレジスタ退避の時しか行われないわけではない
結局これよな
ずっと変なこと言ってる奴いるけど、レジスタ退避もスタック/ヒープも関係なく使っていればキャッシュはされる
2026/07/24(金) 00:59:27.67ID:SqDgs0gR
スタックじゃないとキャッシュに乗らないとか、レジスタ退避の時にしかキャッシュに乗らないとか、とにかくCPUの設計者をバカだと思いすぎだよな
そんなバカな設計になってるわけないのに、頭を使ってない奴はこれだから
2026/07/24(金) 01:12:00.30ID:9TfMzF0I
自演連投と論点ずらしの傾向がだんだんわかってきた
>>924はついに「スタックじゃないとキャッシュに乗らないとか、レジスタ退避の時にしかキャッシュに乗らないとか、」など
誰の書き込みにも存在していない方向へ話をずらしている
2026/07/24(金) 01:48:18.05ID:c1YiTQq7
ディープコピー: 大きなサイズのメモリをコピーすること
スタック巻き戻し: ベースポインタの値をスタックからpopすること
レジスタ退避: リターンアドレスをスタックにpushすること

こりゃ大変だ
927デフォルトの名無しさん
垢版 |
2026/07/24(金) 01:52:59.95ID:qgjP8TGu
もういちいち追ってないけどなんか新情報出てたら教えてくれ
928デフォルトの名無しさん
垢版 |
2026/07/24(金) 01:57:07.03ID:QEapMI1v
相変わらずUIはGUIよりratatuiが圧倒的
2026/07/24(金) 02:25:14.39ID:H84B0AqN
>>926
おじいちゃん、大昔はスタックフレームの管理にベースポインタ(bp/ebp/rbpなど)を使ったけれど
現在はどこのABIでもベースポインタなんて使わないんだよ
無駄だからね
2026/07/24(金) 04:11:45.27ID:nkS/xplE
>>925-926
都合が悪くなると攻撃的なことを言ったりバカにしたりして話をそらしてるのはいつもお前だよw
複おじらしい嘘つきっぷり
2026/07/24(金) 04:12:52.19ID:nkS/xplE
>>926
たしかにお前の頭が大変だな、何一つ読めていないせいで全部間違ってるw
932デフォルトの名無しさん
垢版 |
2026/07/24(金) 04:15:38.70ID:rWosD9Xv
>>925
ずっと言ってる奴いただろ
いくら勝てなくなったからって嘘はよくない
2026/07/24(金) 04:19:18.33ID:lb0jFh4G
少なくともヒープだとキャッシュには乗らない、レジスタ退避がキャッシュ性能に大きな影響を与えるとは確実に言ってたな

> スタックじゃないとキャッシュに乗らないとか、レジスタ退避の時にしかキャッシュに乗らないとか

も曲解ではなく言い換えでしかない
2026/07/24(金) 04:40:12.87ID:apVU3Uz6
>>929
そりゃそうよな

>>925-926
相変わらず書いてあることは読めないし、妄想力は豊かだよね
まあどうせ否定するだろうけど、https://mevius.5ch.io/test/read.cgi/tech/1774264073/679-683 でも散々言われてたように国語ができてなさすぎるよ君
すぐに自演バレするのは、毎回同じ誤読の仕方をするからなんだよ
2026/07/24(金) 04:43:04.89ID:Wi2Ws13b
>>要するに、文脈や構造を見ず文中の単語だけをつまみ食いして、「〜って言ってる!」と脳内変換してしまう、いわゆる**機能的文脈文盲**(単語は読めても構造が理解できない状態)ですね。

これAIの回答っぽいだけに辛辣すぎて笑った
2026/07/24(金) 04:48:34.54ID:CfttdDzL
決定的な認知のゆがみがある奴おるよな
某スレだと「〇おじ」とか
この板に限らずだと古くは「〇の壁」とか
思い込みの世界から一歩も外に出てこないのと
意固地になってるのか
もともと粘着質なのか知らんけど
いつでもどこでもいつまでも聖戦を繰り広げてる
2026/07/24(金) 04:50:17.57ID:CfttdDzL
バカはまともに文章を読めないくせに、そこに書いてる単語から自分にとって都合のいい物語を作ることには熱心だからな
2026/07/24(金) 05:09:59.03ID:LN2X/GDi
また複オジ4連投キタ
2026/07/24(金) 05:24:36.34ID:FvT5yST4
>>938
お前やw
2026/07/24(金) 05:25:10.34ID:gO/X+gvB
複おじはやたら何連投って言いたがるけど、自分はID変えるからバレないと思ってるんだろうな
2026/07/24(金) 05:31:13.14ID:CGZNp1qG
どうぜ図星だったんだろw
2026/07/24(金) 06:06:30.85ID:vznzDL0o
どっちが複おじでどっちが複オジかしらんがまた真夜中ずっと争ってたのか
2026/07/24(金) 07:20:47.88ID:c1YiTQq7
自演じゃないよ〜ん

伝えたいことはもともとびっくりするくらいシンプルなんだけど(大きいデータをコピーするとコストがかかるから気をつけよう!とか)
よく知らない専門用語を雑に当てはめてしまうから、本人以外はその専門用語が正確な意味で使われていると思って誤読してしまう、ということが発生しているんだろうなあと推測しました
2026/07/24(金) 07:44:04.06ID:c1YiTQq7
>>929
これは単純に知らなかったからありがとうね
2026/07/24(金) 08:13:30.89ID:TlV0Uwzc
IDコロコロの誰かさんも自演を訴え始めた今こそ満場一致でワッチョイに移行する好機なのでは?
2026/07/24(金) 08:33:04.60ID:2FjN0coi
>>945
どうぞ
プログラミング言語 Rust 4【ワッチョイ】
https://mevius.5ch.io/test/read.cgi/tech/1514107621/
2026/07/24(金) 08:43:17.13ID:TA527/vs
sp を bp (ebp, rbp) に退避するのは元から ABI の要求に含まれてない。
ABI はインターフェイスの規定なので呼び出し側にとって sp のつじつまが合っていればどんなやり方で実現してもどうでもいいから退避のやり方までは規定する必要がない。
bp を使っていたのは単なる慣例。

スタックトレースのやりやすさとかの都合で今でもデバッグモードではごく普通に bp を使うし、無用になったというわけでもない。
2026/07/24(金) 10:22:56.20ID:OkaVr+Mc
>>947
RustでもC++でもDWARF情報でデバッグできるから今はbp不要
2026/07/24(金) 15:06:00.00ID:WIK69ucb
>>943
> よく知らない専門用語を雑に当てはめてしまうから、本人以外はその専門用語が正確な意味で使われていると思って誤読してしまう
逆では
毎回「そんな定義はない、こうだ!」って主張してる側が定義を間違えてる
2026/07/24(金) 15:11:25.65ID:CXHgHqXT
>>要するに、文脈や構造を見ず文中の単語だけをつまみ食いして、「〜って言ってる!」と脳内変換してしまう、いわゆる**機能的文脈文盲**(単語は読めても構造が理解できない状態)ですね。
2026/07/24(金) 15:54:25.25ID:QEfncnYQ
ローカル変数のムーブをディープコピーだと言い張ったりな
2026/07/24(金) 17:21:57.30ID:Baz7gtD0
参照を含むデータならば
moveやcopyはシャローコピー
参照先も処理するcloneならばディープコピー

参照を含まないデータならば
moveやcopyは単なるコピー
区別する2種類がないためシャローやディープは使われない

いずれにせよmoveをディープコピーと呼ぶことはない
2026/07/24(金) 18:47:46.92ID:24e2kQId
>>951-952
また複おじが妄想を垂れ流し始めたな
散々言われてたことは全部無視して仕切りなおせると思っているらしい
2026/07/24(金) 18:49:07.49ID:o7aCA+Y6
>>952
コピーは発生しないって自信満々に言ってたのに……w
2026/07/24(金) 18:50:40.84ID:24e2kQId
>>952
それ>>827あたりではっきり否定されてた話を書き直しただけな
2026/07/24(金) 18:53:17.62ID:ZfJkjuoc
そもそも複オジはまともなプログラミング知識がないから、言われたことを覚えておけないのも仕方ない
こいつ間違ったことしか言わないし、誤読しかしない
2026/07/24(金) 18:55:21.78ID:LwZ5WlVx
複おじの行動原理はAIに「自分の理解不足を相手の説明能力・理解力のせいにする方が楽だから」と言われてたよなw
958デフォルトの名無しさん
垢版 |
2026/07/24(金) 19:09:20.11ID:0PvzCVIX
>>827は間違ってる
まずスタックやヒープなんて無関係でどこにあってもいい
そのデータをアドレス/ポインタ/参照などで指すデータがある時に、指す先のデータもコピーすればディープコピー
指す先がなければディープは存在しないためディープコピーと言わない
2026/07/24(金) 19:10:16.36ID:Le5u61/j
>>952
「複製する」というアクションを区別する話と
「複製物」という複製した結果として生じるオブジェクトを区別する話を混同してる

moveやcopyは対象が参照を含もうが含むまいが分岐はなくやることは同じ
つまり「複製する」というアクションの区別で言えばシャローコピー

複製された結果の「複製物」の区別で言えば
参照を含まないのであれば複製物がシャローかディープかを論じる意味はない
(これはMDNの定義に書いてある通り)
2026/07/24(金) 19:11:18.43ID:3oZV/qUu
>>958
それも>>733-734で否定されたことをもう一回言ってるだけね
普通にわかってないんだからROMってた方がいいよ君
2026/07/24(金) 19:16:02.26ID:ziGmj28M
元々はこれだろ

>>671
>>スタック領域に大きなデータを置くと関数の壁を跨ぐ度にディープコピーになる

671がディープコピーを誤用したから荒れた
2026/07/24(金) 19:21:21.20ID:EbAMsdeM
>>959
最後の段落はMDNの定義に書いてないし、むしろ矛盾してる
MDNではプリミティブ値についてはシャローコピーとディープコピーは同時に成立するため、通常この区別を論じる必要はないとしている
参照を含むかどうかといった話はされておらず、配列や構造体などプリミティブでないオブジェクトにおいて、この区別が論じられるものということになる

また、中段についてはcopyとmoveに対する誤解がある
copyの場合は値、つまり実体が複製されることになるためMDNの定義によるとディープコピー
一方でmoveは通常(ここは重要)管理構造体しかコピーしないのでシャローコピーとなる

moveにおいて「通常」と強調したのは、スタック領域に実体が置かれている場合、戻り値に指定するとmoveでも実体のコピーが発生する(仕様上の話。最適化の話はまた別)ため、ディープコピーの条件を満たすため
2026/07/24(金) 19:22:08.99ID:EbAMsdeM
>>961
それも>>733-734で否定されたことをもう一回言ってるだけだね、それは誤用じゃなくて正しい用法だよ
普通にわかってないんだからROMってた方がいいよ君
2026/07/24(金) 19:23:51.76ID:ubGLSJxU
ディープコピー(深いコピー)とは - IT用語辞典 e-Words
https://e-words.jp/w/%E3%83%87%E3%82%A3%E3%83%BC%E3%83%97%E3%82%B3%E3%83%94%E3%83%BC.html

> ディープコピーとは、配列やオブジェクトなどのデータ構造を複製する際、同じ構造の実体を新たに作成して対応するデータを写し取る方式。


Deep copy (ディープコピー) - 用語集 | MDN
https://developer.mozilla.org/ja/docs/Glossary/Deep_copy

> オブジェクトの ディープコピー とは、コピー先のオブジェクトのプロパティがコピー元のオブジェクトのプロパティと同一の参照(同じ値を指す)で共有しないコピー方法のことです。結果として、コピー元かコピー先のどちらかを変更しても、もう一方オブジェクトにも変更を及ぼしていないことを保証できます。すなわち、コピー元かコピー先に意図せずに予期しない変更が加えられるこはありません。この振る舞いはシャローコピーとは対照的です。シャローコピーでは、コピー元かコピー先のどちらかを変更するともう一方のオブジェクトも変更される可能性があります。

> プロパティがすべてプリミティブ値であるオブジェクトのコピーは、ディープコピーとシャローコピーの両方の定義に当てはまります。しかし、このようなコピーの深さについて話すのはやや無意味です。というのも、このコピーには入れ子プロパティがなく、ディープコピーについては通常、入れ子プロパティを変更するコンテキストで話すからです。
2026/07/24(金) 19:26:06.72ID:ubGLSJxU
>>961
>>671じゃなくてお前が誤用してるだけな
2026/07/24(金) 19:26:37.26ID:ClG+7gyM
>>962
関数が構造体を返すのは単なるコピー
参照先を持つならシャローコピーと呼んでもよいがディープコピーではない
2026/07/24(金) 19:27:56.84ID:U8nohlki
>>966
お前の独自定義ではそうなんだな
でも俺は今そんな話はしてないんだ
2026/07/24(金) 19:30:12.36ID:B1bgDAdW
Rustなら話は非常に簡単だよね
関数がVecなど構造体を返すのはシャローコピー
clone()して返すとディープコピー
2026/07/24(金) 19:33:33.78ID:Ut9H4FRI
>>968
構造体にもいろいろあるからややこしい
データの実体をどう考えるかという話で、Vecはスタックに置かれる管理構造体は実体ではなくて、データの実体はヒープに置かれた可変長の配列データなので、シャローコピーになる
でも構造体自体がデータの実体なら、そのコピーはディープコピーとなる
970デフォルトの名無しさん
垢版 |
2026/07/24(金) 19:33:57.79ID:1w4K/jCF
>>968
Rustはディープコピーが必ずcloneになるから分かりやすいよな
2026/07/24(金) 19:36:41.47ID:ElAURJKT
.clone() は管理構造体だけでなくヒープに置かれた可変長の配列データという実体をコピーするので、当然ディープコピー
ただ、.clone() 以外の方法で実体をコピーすることもできて、それがCopyトレイトと呼ばれるもの
Rustの場合はこのCopyトレイトがあれば、.clone() でなく代入によってディープコピーを行うことができる
2026/07/24(金) 19:38:29.79ID:ElAURJKT
Rustではあくまで標準状態がmoveなだけで、copyが利用できないわけではないので、プリミティブ値にはこのCopyトレイトが用意されている
この場合必ずディープコピーが発生する(MDNの記述通り、プリミティブ値についてはシャローコピーとディープコピーは同時に成立するため、通常この区別を論じる必要はない)
2026/07/24(金) 19:41:06.80ID:ElAURJKT
ただし、Copyトレイトはプログラマが定義した型に用意することもできるため、プリミティブ値でない値が必ずmoveすることは保証されない
この場合はシャローコピー(一部除くmove)とディープコピー(.clone() または Copyトレイト)が区別される必要がある
2026/07/24(金) 19:43:46.18ID:vUmL0DQY
あれだよね、複オジが「そんなことするのはバカ」って言ってたけど実際はよくされている、moveで受け取ったデータを戻り値で返すを繰り返すパターンは、これがシャローコピーだから成り立っていると
2026/07/24(金) 19:44:41.04ID:Tmh4AYKj
せやな
2026/07/24(金) 19:46:47.08ID:cRa7vLpB
一部、『構造体』と言った時にヒープの管理構造体しか思い浮かばない人が(複おじ以外にも)いるっぽいけど、Rustでは構造体は非常によく使われるので、データの実体を持っていることも普通にある
なので構造体がコピーされる = シャローコピーとは決まっていない
レス数が950を超えています。1000を超えると書き込みができなくなります。

ニューススポーツなんでも実況