[過去ログ] Rust part24 (1002レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
389
(1): デフォルトの名無しさん [sage] 2024/06/27(木) 04:33:33.49 ID:TDzAch9x(1/6) AAS
>>388
388(1): デフォルトの名無しさん [sage] 2024/06/27(木) 04:20:04.01 ID:nawTLqWn(1/2) AAS
スタックは早くてヒープは遅い、みたいな話よく聞くんだけど、
具体的に何が早い/遅いの?
自分でヒープメモリ管理部分を書いてみるとよくわかる
ヒープでメモリ確保したり解放したりするのは色んな処理が入って非常に遅い
スタック上ならそのコストはない
関数に入る&抜けるときにスタックフレームを指してるレジスタの値を変えるだけ

というのに加えて
CPUの多段メモリキャッシュ機構での速さが桁が変わってくる
スタックフレーム上なら常にアクセスしていてキャッシュに載るから超速い
400
(1): デフォルトの名無しさん [sage] 2024/06/27(木) 11:56:53.85 ID:TDzAch9x(2/6) AAS
>>395
395(2): デフォルトの名無しさん [sage] 2024/06/27(木) 10:21:46.91 ID:nawTLqWn(2/2) AAS
>>389
キャッシュに乗るという前提なら、
確保・解放が遅いだけでアクセス速度とかは変わらないってことでOK?

キャッシュに乗る確率とかもスタックとヒープでやっぱちがうんかな
スタックフレーム同士も連続しているし
レジスタ退避でアクセスしているし
他のローカル変数もスタック上にありアクセスしているから
スタック上に確保すればキャッシュ上にある
401
(1): デフォルトの名無しさん [sage] 2024/06/27(木) 12:00:05.74 ID:TDzAch9x(3/6) AAS
>>399
399(4): デフォルトの名無しさん [sage] 2024/06/27(木) 11:20:07.91 ID:veLj9zg3(1/4) AAS
よくわかんないんだけどスタック上に確保したメモリの所有権を外に移して関数は終了してスタックが縮んじゃうとかさ
「そんなわけないだろ」って思うんだけど
関数が値を返す場合にサイズが小さければレジスタで返す
サイズが大きい場合は呼び出し元のスタックフレームに領域を確保してそこへ直接書き込んでいる
つまり暗に可変参照を渡す最適化が行われている
それはサイズの大きい値を返す関数呼び出しが多段でも同じなので一番最初の関数のスタックフレームに直接書き込まれる
404: デフォルトの名無しさん [sage] 2024/06/27(木) 12:53:21.92 ID:TDzAch9x(4/6) AAS
>>402
402(1): デフォルトの名無しさん [sage] 2024/06/27(木) 12:27:57.71 ID:OTNDZ+yC(4/4) AAS
>>399
>「そんなわけないだろ」
その感覚は正しい
Rustを広めたいために勢い余ってデマを流してる香具師が一定数いる

>>401 が正しい
いや>>399の話も正しいんだよ
重要なのはRust上の概念とその実現方法(実装)とその最適化の3つは当然異なるということ

所有権を移すとはmoveという概念であって
moveの実装はコピー(してコピー元を使わない)
ただし無駄なコピーは最適化で消える
例えば大きなサイズの構造体を関数が返す場合は呼び出し元の関数のスタックフレーム上に直接書き込まれることで無駄なコピーが発生しない
417
(1): デフォルトの名無しさん [sage] 2024/06/27(木) 22:40:30.91 ID:TDzAch9x(5/6) AAS
>>406
406(2): デフォルトの名無しさん [sage] 2024/06/27(木) 13:24:58.99 ID:veLj9zg3(2/4) AAS
スタックてのは関数が何段か終了して縮んだあと、また伸び直して前の伸びを上書きしちゃうでしょって話
とにかく「移動」というのが新しくて、代入の移動はわかったけど
関数呼び出しの引数も移動です、返り値も移動ですってのがどういう実装に落とされるのかまだわかってない
そのmoveについてもmoveというRust上の概念の理解のみがRustを学習&利用していく上で必要となるよ
moveによる生成コードがどのようになるかは最適化の方法の変更や進化で変わり得る話だから確定することはできず、学ぶこともできない
こんな場合に現在はたまたまこんな生成コードになっていることだけは実験などでわかるけど今後の保証はない、としか言えない
だからmoveはmoveとして理解することが唯一の正解でしょう
420: デフォルトの名無しさん [sage] 2024/06/27(木) 23:03:07.98 ID:TDzAch9x(6/6) AAS
Rustの各概念を無理矢理なC/C++と結びつけようとしたり生成コードと対応させようとしてる人々がRustを難しいと言ってるようにみえる
そんなことをせずに各概念の理解だけに集中すればRustはシンプルに出来ていてわかりやすい言語だと理解できるよ
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 1.898s*