探検


Rust part38

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2026/07/24(金) 20:04:25.76ID:24e2kQId
公式
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/
(コミュニティによる日本語翻訳版もあります: https://doc.rust-jp.rs/book-ja/)

※Rustを学ぶ際に犯しがちな12の過ち
https://dystroy.org/blog/how-not-to-learn-rust

※Rustのasyncについて知りたければ「async-book」は必読
https://rust-lang.github.io/async-book/

※次スレは原則>>980が立てること

前スレ
Rust part37
https://mevius.5ch.io/test/read.cgi/tech/1784283151/

ワッチョイスレ
プログラミング言語 Rust 4【ワッチョイ】
https://mevius.5ch.io/test/read.cgi/tech/1514107621/
2026/07/24(金) 20:04:44.45ID:24e2kQId
アンチスレはこちらです

Rustアンチスレ
https://mevius.5ch.io/test/read.cgi/tech/1509028624/
2026/07/24(金) 20:06:03.12ID:24e2kQId
ここから複おじの時間かな
2026/07/24(金) 20:07:21.73ID:24e2kQId
978 デフォルトの名無しさん 2026/07/24(金) 19:55:44.17 ID:t7R+hAOc
複おじって荒らしたいマウント取りたいだけで責任は負いたくないタイプだから、どのスレでも980が近づいてくると静かになって、その後けたたましく喚き始めるよな

979 デフォルトの名無しさん 2026/07/24(金) 19:56:54.14 ID:24e2kQId
>978
それな
だから主張が対立してる時に980が近づいてくると、片方がピタッと止まって複オジだとバレることが多い
5デフォルトの名無しさん
垢版 |
2026/07/24(金) 20:09:31.19ID:xViJwJQE
ディープコピーの国際的な定義

https://en.wikipedia.org/wiki/Object_copying#Deep_copy

An alternative is a deep copy, meaning that fields are dereferenced: rather than references to objects being copied, new copy of objects are created for any referenced objects, and references to these are placed in B. Later modifications to the contents remain unique to A or B, as the contents are not shared.

もう一つの方法としてディープコピーがあり、これはフィールドを逆参照することを意味します。オブジェクトへの参照をコピーする代わりに、参照対象オブジェクトに対して新しいオブジェクトのコピーが作成され、それらの参照はBに配置されます。その後の内容の変更はAまたはBに固有のものであり、内容は共有されません。
2026/07/24(金) 20:10:17.17ID:Xlxk45B5
お、テンプレちょっとだけ変わってる
前スレで英語読めない奴がトンデモ誤読かましたThe Bookの日本語版リンクか
2026/07/24(金) 20:11:42.28ID:24e2kQId
>>5
案の定複おじが来たな
WikipediaがMDNより信ぴょう性高いと思ってるのはおもろいけど
たぶんまともにレポートまとめたことがないんだろう
2026/07/24(金) 20:13:06.02ID:24e2kQId
それにそもそも、参照がないとディープコピーじゃないと言ってるんじゃなくて、参照をコピーするだけならシャローコピーだと言ってるのが原文なので、やはり複おじは書いてある内容が読めていない
9sage
垢版 |
2026/07/24(金) 20:13:25.55ID:CNZtFYZY
米国防総省DARPA、C言語のコードからRustへの自動変換実現を目指す「TRACTOR」プログラム開始
https://www.publickey1.jp/blog/24/darpacrusttractor.html

>>1
NASAのSpaceWasm
github.com/nasa/spacewasm
宇宙船上でWasmバイナリを解釈・実行することを目的とした、Wasm 1.0仕様のインタープリタ

静的サイトジェネレータ「Astro 7.0」正式リリース、ビルドシステムがVite 8/Rolldownに、Rust製コンパイラ採用で高速化 - Publickey
https://www.publickey1.jp/blog/26/astro_70vite_8rolldownrust.html

AI「Claude」を使って開発ツールの「Bun」の53万行のZigコード全てをRustへ書き換え
https://gigazine.net/news/20260712-bun-zig-rust/
2026/07/24(金) 20:14:16.28ID:24e2kQId
ディープコピー(深いコピー)とは - 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

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

> プロパティがすべてプリミティブ値であるオブジェクトのコピーは、ディープコピーとシャローコピーの両方の定義に当てはまります。しかし、このようなコピーの深さについて話すのはやや無意味です。というのも、このコピーには入れ子プロパティがなく、ディープコピーについては通常、入れ子プロパティを変更するコンテキストで話すからです。


Wikipediaよりもずいぶん信ぴょう性の高い奴が既に貼られてるんだから、Wikipediaの誤読を全力で披露してもメリットないんだけどな
11sage
垢版 |
2026/07/24(金) 20:14:29.23ID:f+SVyOsm
😭
https://i.imgur.com/QdnVOt2.png
2026/07/24(金) 20:16:25.12ID:LlXviQUD
MDNによるディープコピーの国際的定義
https://developer.mozilla.org/en-US/docs/Glossary/Deep_copy

A deep copy of an object is a copy whose properties do not share the same references (point to the same underlying values) as those of the source object from which the copy was made. As a result, when you change either the source or the copy, you can be assured you're not causing the other object to change too. That behavior contrasts with the behavior of a shallow copy, in which changes to nested properties in the source or the copy may cause the other object to change too.

オブジェクトのディープコピーとは、コピーが作成された元のオブジェクトのプロパティが同じ参照を共有しないコピーのことです。そのため、ソースやコピーのどちらかを変更しても、他のオブジェクトも変わってしまうことはないと安心できます。この挙動は、ソースやコピーのネストされたプロパティの変更が他のオブジェクトも変わらせるシャローコピーの挙動とは対照的です。
2026/07/24(金) 20:18:53.10ID:LlXviQUD
>>5
>>12
どちらも同じじゃん
「ディープコピー」=「参照を持つ時にその参照先もコピーすること」
2026/07/24(金) 20:22:41.95ID:1OxC7FN6
Cowのcloneがシャローなのかディープなのか答えが出たら起こして
2026/07/24(金) 20:23:52.27ID:Wgnb45Q4
>>12-13
「国際的定義!(ドヤッ」ってやってるけど、ただ英語版コピーしてるだけでMDNの日本語版は英語版からの翻訳だから一緒のことしか書いてないというのがおもろい

「同じ参照を共有しないコピー」だから「参照を持たない値」は該当するって程度のことがわからないのか
文盲がイキるとこうなるんだな
16デフォルトの名無しさん
垢版 |
2026/07/24(金) 20:25:06.01ID:K88Cv8Wt
参照を持つと二段(以上)になるため二種類のコピーが生じるから区別するための用語
一段目のみコピーがシャローコピー
二段目(以上)もコピーすることがディープコピー
2026/07/24(金) 20:25:25.04ID:Wgnb45Q4
>>10にも
> 同一の参照(同じ値を指す)で共有しないコピー方法のことです
って書いてあんだよな、しっかり
その上で
> すべてプリミティブ値であるオブジェクトのコピーは、ディープコピーとシャローコピーの両方の定義に当てはまります
だから、参照を持つなんて一言も言ってないし、むしろ持たない場合も当てはまると断言してる
2026/07/24(金) 20:26:15.14ID:Wgnb45Q4
>>16
複オジ理論ではそうなんだな
どう見てもそんなこと書いてないから、ただの複おじの思い込みだけど
19デフォルトの名無しさん
垢版 |
2026/07/24(金) 20:26:28.21ID:K88Cv8Wt
>>15
参照を持たないデータ構造にはシャローもディープもない
この区別するための用語は使われない
2026/07/24(金) 20:26:53.48ID:rdpw7v0/
複おじって負けそうになると他の荒らしを呼び込みたいからか熱心に上げ始めるよな
2026/07/24(金) 20:27:11.48ID:rdpw7v0/
>>19
複オジ理論ではそうなんだな
どう見てもそんなこと書いてないから、ただの複おじの思い込みだけど
2026/07/24(金) 20:29:18.45ID:7VloRDER
> このコピーには入れ子プロパティがなく、ディープコピーについては通常、入れ子プロパティを変更するコンテキストで話すからです
これは明らかに配列や構造体のことであって、参照のことではない
わざわざ参照という言葉を排除して、入れ子プロパティと言い切っている
2026/07/24(金) 20:32:20.07ID:tCfuinXR
>>12の続き

MDNによるディープコピーの国際的定義
https://developer.mozilla.org/en-US/docs/Glossary/Deep_copy

The copy of an object whose properties all have primitive values fits the definition of both a deep copy and a shallow copy. It is somewhat useless to talk about the depth of such a copy, though, because it has no nested properties and we usually talk about deep copying in the context of mutating nested properties.

すべてのプロパティがプリミティブ値を持つオブジェクトのコピーは、ディープコピーとシャローコピーの両方の定義に当てはまります。しかしそのようなコピーの深さについて語るのは無意味です。なぜなら入れ子状の性質がないからです。通常は入れ子状の性質の文脈でディープコピーについて語ります。
24デフォルトの名無しさん
垢版 |
2026/07/24(金) 20:33:30.09ID:rpH54ETT
>>22
>>23
ようするに入れ子状のデータに対してのみディープコピーと呼ぶわけだ
25sage
垢版 |
2026/07/24(金) 20:33:44.00ID:mq5FsCip
>>14
ディープでしょ🤔
2026/07/24(金) 20:34:46.85ID:I7AzWuQz
>>23
英語で書いてあったら何でも国際的定義だと思ってる複オジw
2026/07/24(金) 20:35:41.91ID:I7AzWuQz
しかも内容は>>10と完全に一致
2026/07/24(金) 20:41:42.94ID:9wp/NKTp
struct Fooがあるとして
fn foo() -> Foo {
...
}
この関数による構造体返しはmoveになるが

①Fooが入れ子状の時
シャローコピーになる

②Fooが入れ子状でない時
シャローでもディープでもあるが
>>23に示されてあるように
敢えてシャローやディープと言わない

どちらにしてもディープコピーと言わない
2026/07/24(金) 20:48:28.73ID:9wp/NKTp
関数から返す場合だけでなく
Rustにおけるmoveは全て同様
moveに対してディープコピーと呼ぶことはない
2026/07/24(金) 20:49:08.87ID:iRaInXiA
>>28
1は構造体がスタックにあるかヒープにあるか言っていないのでシャローコピーとは確定できない
前スレで散々言われてたけど反論できない上に認められないから君がスルーしてたやつね

2は構造体なのに入れ子じゃない時って仮定がまずありえない
構造体って何か知らないのかなこいつw
2026/07/24(金) 20:50:43.71ID:JtKQuH3B
copyの場合は値、つまり実体が複製されることになるためMDNの定義によるとディープコピー
一方でmoveは通常(ここは重要)管理構造体しかコピーしないのでシャローコピーとなる

moveにおいて「通常」と強調したのは、スタック領域に実体が置かれている場合、戻り値に指定するとmoveでも実体のコピーが発生する(仕様上の話。最適化の話はまた別)ため、ディープコピーの条件を満たすため

ディープコピーというのはあくまで、実体を新たに作成して対応するデータを写し取る複製のことだから、スタックがpopされて実体の置き場所を変更する必要が生まれた時は、当然ディープコピーせざるを得ない
実際は先に、受け取る側のスタックに確保しておいてこのアドレスを使わせるという最適化が走るので、仕様上発生するはずのディープコピーは発生しないけど、これは最適化なのでできるパターンとできないパターンがある
2026/07/24(金) 20:51:56.92ID:lTU+Eo0O
複おじは一度読み飛ばしたものは二度と振り返れないからコピペしておいてやったぞ
2026/07/24(金) 20:58:17.06ID:9wp/NKTp
>>30
構造体のフィールドを入れ子と呼んでいるのではない
例えばstruct Foo(i32, i32)は入れ子ではない
Box<Foo>は入れ子
struct Bar(Box<i32>)も入れ子
2026/07/24(金) 21:00:10.05ID:WVcSNKWA
>>33
お前の勝手な定義はいいからw
明らかに書いてない「参照がないとダメ」を通すために言い換えようとしてるだけで入れ子の話じゃないし
2026/07/24(金) 21:01:37.34ID:9wp/NKTp
>>31
それは君の勝手な定義
MDNでもWikipediaでも入れ子先をコピーする時がディープコピー
2026/07/24(金) 21:02:09.97ID:B0iC6lo0
>>33 複オジにはわからないらしいが、わざわざプリミティブ値と対比して入れ子プロパティを持つ値について語ってるんだから、構造体や配列は入れ子プロパティを持つ値なんだよな
まあ、複オジは日本語わからなくてトンデモ誤読繰り返してきたから今更だけど
2026/07/24(金) 21:03:11.39ID:aP8wMpRV
>>35
そんなことは言ってないんだわ
「参照がないとダメ」を「入れ子とは参照があること」と言い換えてるだけだろと言ってる
2026/07/24(金) 21:03:36.97ID:t739HGtC
相変わらずの複おじ誤読芸
2026/07/24(金) 21:05:23.78ID:9wp/NKTp
>>36
それは君が間違っている
明確にnestedと書かれている
2026/07/24(金) 21:09:14.37ID:2mIwVUu3
>>39
そういえばお前って構造体の構造知らなかったなw
実は構造体はその型の中に他の値を入れるネストされる型なんだ
2026/07/24(金) 21:10:26.04ID:DpS8oXRR
な、なんだってー(棒)

真面目な話、ネストしないとか入れ子じゃないとかそんな構造体ないんだよな
メンバのない構造体って何に使うの
42デフォルトの名無しさん
垢版 |
2026/07/24(金) 21:11:13.02ID:rpH54ETT
>>36
おまえは英語を読めないのか?
プリミティブ値と対比してるのではない
全てのプロパティ(フィールド)がプリミティブ値のオブジェクトと対比してる
もちろんそれはディープコピーではなく両方に該当すると明記されてる


>>23
>>The copy of an object whose properties all have primitive values fits the definition of both a deep copy and a shallow copy.
43デフォルトの名無しさん
垢版 |
2026/07/24(金) 21:12:58.36ID:rpH54ETT
>>40
そのネストがプリミティブ値ならばディープコピーではなく両方に該当と明記されてる
ネストが他のオブジェクトを指す時のみディープコピーとシャローコピーの区別が発生する
2026/07/24(金) 21:13:51.34ID:kHPEnV+a
>>42
また不安になったから上げたな、複オジはこういう時荒らしを入れてごまかすのが好きね
あと、英語を読めないのはお前な
全てプリミティブ値であるオブジェクトというのは、オブジェクトがプリミティブ型の値によるということであって、プリミティブ値を複数組み合わせたものの話をしてるわけじゃない
プリミティブ値を複数組み合わせた場合には、入れ子プロパティを持つということになる
2026/07/24(金) 21:15:07.72ID:I/0Y9kPO
>>43
普通に嘘すぎて笑う
そんなことどこにも書いてねえよ
2つの文章の単語を自由に混ぜ合わせるなw
2026/07/24(金) 21:16:47.74ID:2eRGQl9j
複おじって相手を言い負かすことが目的だから主張が180°変わるんだよな
2026/07/24(金) 21:18:41.32ID:2eRGQl9j
「ディープコピーはプリミティブ値じゃないメンバを含む構造体をコピーすること」「ディープコピーは参照を含むものの本体をコピーすること」「ディープコピーはヒープ領域にある値をコピーすること」
全部一致してない
2026/07/24(金) 21:19:25.98ID:WKAMhSVT
複オジにとっては自分の言ってることが正しいかどうかなんてどうでもよくて、ただ荒らしたいだけだから
2026/07/24(金) 21:21:02.60ID:YCkq/OUB
>>43
実は文章の中から都合のいい単語を抜き出して組み合わせると元の文章と違う意味になるんですよ
2026/07/24(金) 21:25:28.82ID:Yv0qy+ya
流石にプリミティブ値のメンバだけで構成されていたらどれだけ大きくても絶対にディープコピーにならないというのは意味不明すぎて笑う
51デフォルトの名無しさん
垢版 |
2026/07/24(金) 21:25:40.62ID:rpH54ETT
>>44
そんなことはディープコピーの定義>>5にも>>12にも書かれていない

例えばstruct X(i32, i32)
これはディープとシャローが一致するため
通常ディープコピーと呼ばないと明記されてる

例えばstruct X(i32, &X) ライフタイム略
これはディープとシャローが一致しないため
&Xの指してる先もコピーすればディープコピーだが
ムーブはシャローコピーになる
52デフォルトの名無しさん
垢版 |
2026/07/24(金) 21:26:33.68ID:c1YiTQq7
>>46
最近はクローン複おじが現れてそれが起きても話が流れないから永続戦争状態になってて面白い
53デフォルトの名無しさん
垢版 |
2026/07/24(金) 21:26:42.26ID:rpH54ETT
>>50
じゃあサイズいくつから突然ディープコピーになると主張してるの?
2026/07/24(金) 21:30:32.79ID:/w/RcGUU
>>51
> 例えばstruct X(i32, i32)
> これはディープとシャローが一致するため
> 通常ディープコピーと呼ばないと明記されてる
普通に嘘
これはプリミティブ値によるオブジェクトではないので実体のコピーがあればディープコピー、先頭アドレスのコピーであればシャローコピー

>>53
お前が言い出した変な主張がおかしいだけ
2026/07/24(金) 21:36:40.67ID:HNCV0mwh
>>53
誰もそんなことは言ってない
オブジェクトがプリミティブ値でない場合は実体をコピーすればディープコピーであり、しなければシャローコピーであると区別できる
2026/07/24(金) 21:41:58.76ID:vZeGyDIK
>>54
それは間違ってるんじゃない

let x = X(12, 34);
let y = x;
これはディープコピーではないよ
この定義からシャローコピー
Shallow copies are simple and typically cheap, as they can usually be implemented by simply copying the bits exactly.
2026/07/24(金) 21:57:12.06ID:jneIAs+H
そりゃムーブしただけだからな
2026/07/24(金) 22:04:31.36ID:vZeGyDIK
>>57
ムーブしただけなのにディープコピーと言い張る人が前スレにいた

671 デフォルトの名無しさん sage 2026/07/21(火) 16:03:56.55 ID:8y3GD3Tf
スタック領域に大きなデータを置くと関数の壁を跨ぐ度にディープコピーになる
59デフォルトの名無しさん
垢版 |
2026/07/24(金) 22:16:33.60ID:rpH54ETT
ムーブはディープコピーにならない
入れ子先をコピーしないため
2026/07/24(金) 22:47:24.20ID:vZeGyDIK
前スレ671さんが勘違いした理由はおそらく
オブジェクトを値として直接扱えずに常に参照で扱う他の言語の感覚だったからじゃないかな

Rustはオブジェクトをそのまま値として変数に入れたりムーブできる
だからオブジェクトの中に参照を持たない限りディープコピーにならない
もちろんRustでも参照を変数に持つことで以下述べる状況にもできる

一方でオブジェクトを常に参照で扱う言語は変数に格納する時にそのオブジェクトへの参照を格納する
この種の言語だと変数に格納されてる参照をコピーするだけならシャローコピーだけど
参照が指してるオブジェクトをコピーするとディープコピーになる
2026/07/24(金) 23:53:14.86ID:/LVEjW8F
ディープコピーを勘違いしていて散々馬鹿にされたあの複おじがディープコピーを勘違いしている複おじ二世を諭す側になっているというのがなんとも感慨深いな
2026/07/25(土) 00:10:54.83ID:yA1FjEyp
ついに正解に辿り着いたのか
2026/07/25(土) 00:30:20.59ID:jRf3NZQv
>>58-62
間違いがあるな
ムーブ = ディープコピーだなんて言ってる奴はいない
その人はずっとスタックがpopされる時に移動する値があるという話をしている
なので>>60が言ってることはむしろ>>60自身に当てはまってて、

> Rustはオブジェクトをそのまま値として変数に入れたりムーブできる
> だからオブジェクトの中に参照を持たない限りディープコピーにならない

これには1つ重大な見落としがある
Rustではムーブは所有権を移す行いであるため、メモリの寿命はムーブされた後のスコープによって管理される

しかし、スタックがpopされる場合そのメモリ領域は解放されてしまうため、そのままではムーブしたはずなのにUse-after-freeが発生する
これを防ぐためにはpopされる領域から事前にメモリを書き写す必要があり、これは実体を丸ごと移動させるディープコピーとならざるを得ない
これがずっと言われてることであって、Rustの仕様としては完全に正しい

これについて、前スレではReturn Value Optimizationで防がれるという、いい主張があったがこれはコンパイラの最適化によるものであって、仕様として確定したものはないという話だった

逆に、今>>58-62が言ってるのはヒープ領域に限ったムーブの説明にしかなっていないし、>>56の例はスコープが変わっていないのでスタックのpopは発生しないため例として不適切であることになる
そのため、前スレにおける議論よりもずいぶん低レベルで、とにかく相手が言っていることを間違っていると言えれば満足というものに変わってしまっている
2026/07/25(土) 00:33:03.68ID:m5hU/HdI
>>63
>>これは実体を丸ごと移動させるディープコピーとならざるを得ない

そこが貴方の間違い
単なる値のムーブなのでディープコピーではない
Rustのムーブがディープコピーになることはない
65デフォルトの名無しさん
垢版 |
2026/07/25(土) 00:33:24.06ID:47WIMuh3
それな
というか、そうじゃなかったらRVOなんて存在しないんだよな
>>58-62の主張だとRustにはRVOは存在しないことになるが、本当にそうかどうかは調べた方がいい
2026/07/25(土) 00:34:11.72ID:bstVFDuM
>>64
また勘違い解釈が出たな

> 単なる値のムーブなのでディープコピーではない
それたぶんこのスレに入ってからも何回か否定されてるぞ
2026/07/25(土) 00:35:46.32ID:eZT8/Ty+
>>65
たぶん>>63に同意してるんだと思うが、まあそりゃそうなるんだよな
スタックがpopされるときに実体のコピーが発生しないと仮定すると、RVOという言葉はおかしくなる
それは最適化じゃなくて言語仕様としての義務になるからな
2026/07/25(土) 00:36:28.79ID:eZT8/Ty+
>>64
ディープコピー(深いコピー)とは - 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/25(土) 00:39:26.43ID:m5hU/HdI
>>65
RVOはシャローコピーだぞ
例えばVecを返す時に連続体の部分はコピーしない
長さ二つとアドレスの3点のみコピーする
2026/07/25(土) 00:39:38.81ID:ggq/DgOO
>>63が言ってることと同じことが書いてあるな
https://users.rust-lang.org/t/does-rust-have-return-value-optimization/10389

> it's just like (current) C++ in this regard - it's an optimization, without any guarantees that it'll happen. Not sure if that will change with MIR maturing and rust doing its own pre-LLVM optimizations.
→ これは(現在の)C++とまったく同じで、それが実現するという保証がまったくない最適化です。MIRが成熟し、Rustが独自のLLVM前最適化を行うことで、それが変わるかどうかはわかりません。
2026/07/25(土) 00:40:48.47ID:+sd0sCI1
>>69
何言ってんだこいつ
RVOが最適化として存在するということは、大前提それで最適化されないとディープコピーされることを意味している、という話だぞ
2026/07/25(土) 00:42:53.41ID:m5hU/HdI
>>70
それはディープコピーとシャローコピーの違いと一切の関係がない
2026/07/25(土) 00:44:31.56ID:m5hU/HdI
>>71
貴方はRVOが何なのか理解できてないのか?
関数が値をレジスタ返しできない時に呼び出し元に直接書き込む最適化の話だぞ
どこにもディープコピーの要素がない
2026/07/25(土) 00:45:27.39ID:YZc0yK18
>>72
当たり前だろ
そんな低レベルな話はMDN見ろで済むこと
2026/07/25(土) 00:47:09.32ID:m5hU/HdI
>>74
MDNにディープコピーの説明がある
Rustのムーブがディープコピーになることはない
2026/07/25(土) 00:47:38.39ID:lWzgIol7
>>73
まだRVOがディープコピーしてると思ってるの日本語読解力が0どころかマイナスだろ
ディープコピーを防ぐための機能がRVOじゃマヌケ

値をレジスタ返しできないなんてことは関係ない
そもそもレジスタで返されたところでメモリに書き込む必要はあるんだから、レジスタで返せたらすっきり終わりだと思ってる時点で頭が回っていない
というかこの複おじの「レジスタを魔法のストレージだと思っている」現象何なんだ
2026/07/25(土) 00:48:38.59ID:v9E5M8Mr
>>75
はいはい、お前の中ではそうなんだねw
どう見ても>>63は完全に正しいことを言ってるけど、複オジにはわからないか
2026/07/25(土) 00:49:49.12ID:EHXKadgF
>>73
複オジは知らないことで威張るの好きだよな
RVOはオブジェクトのコピーを省略するための最適化じゃマヌケ
2026/07/25(土) 00:51:07.13ID:yZnT0yMD
Rustではムーブは所有権を移す行いであるため、メモリの寿命はムーブされた後のスコープによって管理される

しかし、スタックがpopされる場合そのメモリ領域は解放されてしまうため、そのままではムーブしたはずなのにUse-after-freeが発生する
これを防ぐためにはpopされる領域から事前にメモリを書き写す必要があり、これは実体を丸ごと移動させるディープコピーとならざるを得ない
これがずっと言われてることであって、Rustの仕様としては完全に正しい

これについて、前スレではReturn Value Optimizationで防がれるという、いい主張があったがこれはコンパイラの最適化によるものであって、仕様として確定したものはない

> it's just like (current) C++ in this regard - it's an optimization, without any guarantees that it'll happen. Not sure if that will change with MIR maturing and rust doing its own pre-LLVM optimizations.
→ これは(現在の)C++とまったく同じで、それが実現するという保証がまったくない最適化です。MIRが成熟し、Rustが独自のLLVM前最適化を行うことで、それが変わるかどうかはわかりません。
https://users.rust-lang.org/t/does-rust-have-return-value-optimization/10389
2026/07/25(土) 00:54:07.17ID:0WqDWpvy
The Bookには「there’s a design choices … : Rust will never automatically create “deep” copies of your data」と書いてる

Rustは自動的にディープコピーを作ることは決してない、という設計選択をしている

The Bookの著者が勘違いをしているのか君が勘違いをしているのかどっちだろうね〜?
2026/07/25(土) 00:55:33.08ID:fqYQyOjc
>>80
そりゃThe Bookにおいてはディープコピーという言葉はヒープのみに限定して使われてるからな
一般的な用法ではないが、そのように定義しているというだけの話
2026/07/25(土) 00:55:34.81ID:GrgDaK5Z
そこは最適化の有無と関係ない
ムーブは最適化されても最適化されなくてもシャローコピー
2026/07/25(土) 00:57:20.17ID:BPvLmugh
>>82
そうだとすれば、スタックに置かれたデータはRVOがないとムーブで戻り値として返却できないことになるな
あるかないかわからない最適化がないと返却できない、そんな言語仕様だと君は言いたいのかい?
2026/07/25(土) 00:57:25.34ID:m5hU/HdI
>>81
ヒープに限定されない
参照先がスタック上でも同じ
ムーブは参照先をコピーしない
2026/07/25(土) 00:59:12.53ID:GrgDaK5Z
>>83
ムーブは最適化の有無に関係なくシャローコピー
ディープコピーしない
2026/07/25(土) 00:59:42.58ID:BPvLmugh
>>84
じゃあどうやってスタック上の値が戻り値としてムーブされるのか説明してもらってもいい?
スタックだから当然関数の終わりでスコープが終わることで、このメモリ領域はpopされるぜ?
2026/07/25(土) 01:00:42.64ID:m5hU/HdI
>>83
ムーブは最適化がなければビットコピーだよ
RVOを切っても同じ
2026/07/25(土) 01:00:44.95ID:0WqDWpvy
>>81
ヒープのみに限定して使われてるってThe Bookのどこに書いてあるのかな〜?
おしえておしえて〜
2026/07/25(土) 01:01:40.71ID:BPvLmugh
Rustではムーブは所有権を移す行いであるため、メモリの寿命はムーブされた後のスコープによって管理される

しかし、スタックがpopされる場合そのメモリ領域は解放されてしまうため、そのままではムーブしたはずなのにUse-after-freeが発生する
これを防ぐためにはpopされる領域から事前にメモリを書き写す必要があり、これは実体を丸ごと移動させるディープコピー(※)とならざるを得ない
これがずっと言われてることであって、Rustの仕様としては完全に正しい

これについて、前スレではReturn Value Optimizationで防がれるという、いい主張があったがこれはコンパイラの最適化によるものであって、仕様として確定したものはない

> it's just like (current) C++ in this regard - it's an optimization, without any guarantees that it'll happen. Not sure if that will change with MIR maturing and rust doing its own pre-LLVM optimizations.
→ これは(現在の)C++とまったく同じで、それが実現するという保証がまったくない最適化です。MIRが成熟し、Rustが独自のLLVM前最適化を行うことで、それが変わるかどうかはわかりません。
https://users.rust-lang.org/t/does-rust-have-return-value-optimization/10389

※MDNの定義であり、一般的
The Bookではビットコピーという変わった言葉が使われることがあるらしい、複オジ情報だから怪しいが
2026/07/25(土) 01:02:45.59ID:GrgDaK5Z
>>86
ムーブが何かを正しく覚えよう
trait Copyのところに書かれてるよ
最適化されないとコピーされる
もちろんディープじゃない
2026/07/25(土) 01:02:57.64ID:BPvLmugh
>>84-85
>>87-88
こいつら>>86の

>>じゃあどうやってスタック上の値が戻り値としてムーブされるのか説明してもらってもいい?
>>スタックだから当然関数の終わりでスコープが終わることで、このメモリ領域はpopされるぜ?

には答えられなさそうだな
2026/07/25(土) 01:03:59.21ID:IFke0mwN
>>90
お前の中ではディープじゃないのはわかったって
MDN定義ではディープ、お前定義では違うってのはわかったから、そこはもういいから質問に答えようぜ
2026/07/25(土) 01:04:10.58ID:m5hU/HdI
>>89
君だけディープコピーを勘違いしてる
2026/07/25(土) 01:04:52.50ID:IFke0mwN
>>93
原文出されて否定されてるのに、まだそれ言ってるの流石に飽きたからもういいよ
2026/07/25(土) 01:05:50.94ID:m5hU/HdI
>>92
なるほど
MDNの定義を誤読してるのか
まずはちゃんと読め
2026/07/25(土) 01:06:06.22ID:IFke0mwN
Rustではムーブは所有権を移す行いであるため、メモリの寿命はムーブされた後のスコープによって管理される

しかし、スタックがpopされる場合そのメモリ領域は解放されてしまうため、そのままではムーブしたはずなのにUse-after-freeが発生する
これを防ぐためにはpopされる領域から事前にメモリを書き写す必要があり、これは実体を丸ごと移動させる実体ごとのコピー(※)とならざるを得ない
これがずっと言われてることであって、Rustの仕様としては完全に正しい

これについて、前スレではReturn Value Optimizationで防がれるという、いい主張があったがこれはコンパイラの最適化によるものであって、仕様として確定したものはない

> it's just like (current) C++ in this regard - it's an optimization, without any guarantees that it'll happen. Not sure if that will change with MIR maturing and rust doing its own pre-LLVM optimizations.
→ これは(現在の)C++とまったく同じで、それが実現するという保証がまったくない最適化です。MIRが成熟し、Rustが独自のLLVM前最適化を行うことで、それが変わるかどうかはわかりません。
https://users.rust-lang.org/t/does-rust-have-return-value-optimization/10389

※複オジ定義でディープコピーじゃないということで延々そこにばかり嚙みついて議論を回避しようとするので、複オジ定義の言葉に書き換えてあげました
2026/07/25(土) 01:07:11.67ID:N92SZQwm
>>95
お前がなーw


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

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

> プロパティがすべてプリミティブ値であるオブジェクトのコピーは、ディープコピーとシャローコピーの両方の定義に当てはまります。しかし、このようなコピーの深さについて話すのはやや無意味です。というのも、このコピーには入れ子プロパティがなく、ディープコピーについては通常、入れ子プロパティを変更するコンテキストで話すからです。


どう見ても実体のコピーはディープコピーだぞw
2026/07/25(土) 01:07:46.10ID:N92SZQwm
>>95
反論されないようにあえて何がディープコピーになるのか言わないようになってて草
2026/07/25(土) 01:08:34.16ID:Nxs+SX3U
>>93
>>95
やっぱりこいつら>>86の

>>じゃあどうやってスタック上の値が戻り値としてムーブされるのか説明してもらってもいい?
>>スタックだから当然関数の終わりでスコープが終わることで、このメモリ領域はpopされるぜ?

には答えられないみたいだな
2026/07/25(土) 01:09:11.69ID:yHwe+V9G
>>96で複オジ定義準拠になったからこれで本題に入れるなw
2026/07/25(土) 01:10:30.05ID:GrgDaK5Z
なぜかMDNのJavaScriptのオブジェクトについてのディープコピーの話を見てるから誤解してるんだろうな
まず重要なことはJavaScriptのオブジェクトは値そのまま変数などへ格納することができない
オブジェクトの値を指す参照が変数はプロパティに格納される
だから深さが一つ異なる
■ このスレッドは過去ログ倉庫に格納されています

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