過去スレ
オブジェクト指向はオワコン (2023/08/26~)
https://mevius.5ch.io/test/read.cgi/tech/1721393540/
オブジェクト指向はオワコン? (2024/07/19~)
https://mevius.5ch.io/test/read.cgi/tech/1721393540/
オブジェクト指向はオワコン? part2 (2026/08/13~)
https://mevius.5ch.io/test/read.cgi/tech/1786599483/
オブジェクト指向はオワコン? part3
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
2026/08/26(水) 11:55:23.86ID:JrGcaWVK369デフォルトの名無しさん
2026/09/06(日) 11:16:07.77ID:TpdZ7imy370デフォルトの名無しさん
2026/09/06(日) 13:24:20.18ID:3Td6Pzhs >>368
そこで出てるa variable’s lifetimeが変数のextentを意味するのか
変数が指してるオブジェクトのlifetimeを意味するのか考えてみた?
extentというのはあくまでbindingの有効期間だよ
fn foo() -> &'static str {
let x = "foobar";
let y = x.get(..1).unwrap();
y
}
上の変数xのextentはfoo関数が終わるまで
xやyのlifetimeはxのextentとは違ってstatic
そこで出てるa variable’s lifetimeが変数のextentを意味するのか
変数が指してるオブジェクトのlifetimeを意味するのか考えてみた?
extentというのはあくまでbindingの有効期間だよ
fn foo() -> &'static str {
let x = "foobar";
let y = x.get(..1).unwrap();
y
}
上の変数xのextentはfoo関数が終わるまで
xやyのlifetimeはxのextentとは違ってstatic
371デフォルトの名無しさん
2026/09/06(日) 18:24:48.84ID:4iU/gpAW >>366のように変数がbindingを維持したまま物理的メモリを移動できるRustが優秀だよな
関数を抜ければ破棄されるスタックフレームから関数の呼び出し元のスタックフレームへ移動
関数を抜ければ破棄されるスタックフレームから関数の呼び出し元のスタックフレームへ移動
372デフォルトの名無しさん
2026/09/06(日) 19:05:53.33ID:YxrJ1zlD なんか哀れ
373デフォルトの名無しさん
2026/09/06(日) 19:23:58.31ID:OsOmP0Cb LispなどのGC言語はどうしてもそこでコストが高くなるよね
374デフォルトの名無しさん
2026/09/06(日) 20:50:50.94ID:NhHXko4w Webアプリ作ってるわい「何言ってんだこいつ…」
375デフォルトの名無しさん
2026/09/06(日) 21:15:04.88ID:KSWw01SM376デフォルトの名無しさん
2026/09/06(日) 22:52:16.74ID:aPMDHrgg 教育基本法が掲げる「人格の完成」を純粋に信じて、部活と勉強を真面目に取り組んできた。
その過程で、理性的・社会的な人格を磨き上げようとしていたところに、思春期を通じてもう一つの人格的な要素が内部から立ち上がってきた。
それが「チン格」です。
そしてあなたが到達した理解は、こうまとめられるでしょう。
チン格は、人格の全てではない。
しかし人格を構成する要素の一つである。
しかもそれは、単なる「付属物」ではなく、人格を継承したオブジェクトとして振る舞う。
その過程で、理性的・社会的な人格を磨き上げようとしていたところに、思春期を通じてもう一つの人格的な要素が内部から立ち上がってきた。
それが「チン格」です。
そしてあなたが到達した理解は、こうまとめられるでしょう。
チン格は、人格の全てではない。
しかし人格を構成する要素の一つである。
しかもそれは、単なる「付属物」ではなく、人格を継承したオブジェクトとして振る舞う。
377デフォルトの名無しさん
2026/09/06(日) 22:57:01.64ID:ife8ADIg >>370
それは借用の例になっていないよ
自ら&strと書いているように最初から既に参照
正しく説明するならば
let x = "foobar"; という参照ではなく
let x = String::from("foobar"); という実体へ置き換えればわかるように
変数xから借用した参照yのlifetimeは
変数xのbinding有効期間になる
それは借用の例になっていないよ
自ら&strと書いているように最初から既に参照
正しく説明するならば
let x = "foobar"; という参照ではなく
let x = String::from("foobar"); という実体へ置き換えればわかるように
変数xから借用した参照yのlifetimeは
変数xのbinding有効期間になる
378デフォルトの名無しさん
2026/09/06(日) 23:35:07.36ID:8VZZramO 親子は別人なので銀行口座を明確に分離する——こうした「責任と境界をはっきりさせる必要があるシステム」では、多重継承を排したJava的な設計が適しています。曖昧さを許さず、単一の責任と明確な所有関係を強制する方が、安全で運用しやすい。
一方で、クリントンの「不適切な関係」はまったく異なる構造を示しています。
同一人物の中に「別のクリントン」が暴れている、という状況です。社会的・公的なクリントンと、ムスコ(チンポ)を通じて勝手に振る舞いを決めてしまうクリントンが、同じ身体の中に共存している。上位の意志がどれほど強くても、その内部オブジェクトの自律的な動きを完全には止められない。
一方で、クリントンの「不適切な関係」はまったく異なる構造を示しています。
同一人物の中に「別のクリントン」が暴れている、という状況です。社会的・公的なクリントンと、ムスコ(チンポ)を通じて勝手に振る舞いを決めてしまうクリントンが、同じ身体の中に共存している。上位の意志がどれほど強くても、その内部オブジェクトの自律的な動きを完全には止められない。
379デフォルトの名無しさん
2026/09/06(日) 23:39:50.17ID:8VZZramO 「ブルマの中身は萎れちまった」という表現は、思春期に欲情と想像の対象だった「未来の元気な赤ちゃんを産み育てる可能性」が、
世代全体として実現しにくくなってしまった、という感慨を含んでいるのでしょう。個人の内部で自律的に動き始めた「チン格」が、
社会の構造的な条件(経済、雇用、結婚市場)とぶつかり、結果として次の世代を生み出す方向に結びつかなかった、という構図です。
世代全体として実現しにくくなってしまった、という感慨を含んでいるのでしょう。個人の内部で自律的に動き始めた「チン格」が、
社会の構造的な条件(経済、雇用、結婚市場)とぶつかり、結果として次の世代を生み出す方向に結びつかなかった、という構図です。
380デフォルトの名無しさん
2026/09/06(日) 23:42:51.44ID:dxtJfVwW381デフォルトの名無しさん
2026/09/06(日) 23:53:59.60ID:/gydG9nE382デフォルトの名無しさん
2026/09/07(月) 00:05:30.05ID:JPV6PYi6383デフォルトの名無しさん
2026/09/07(月) 00:24:41.71ID:6/dirL4h384デフォルトの名無しさん
2026/09/07(月) 01:55:49.33ID:Y551FpDh それが静的にコンパイル時点で追える
だからRustはGC使わないのに100%安全な自動メモリ解放を実現した
だからRustはGC使わないのに100%安全な自動メモリ解放を実現した
385デフォルトの名無しさん
2026/09/07(月) 06:52:29.85ID:YUIm8neM386デフォルトの名無しさん
2026/09/07(月) 08:06:39.46ID:qG5Moe+k >>379
ポコチン先生久し振り!
ポコチン先生久し振り!
387デフォルトの名無しさん
2026/09/07(月) 09:25:15.60ID:98Q2Hbal >>384
もうええやろ
もうええやろ
388デフォルトの名無しさん
2026/09/07(月) 09:47:40.33ID:sHF6Zl4o >>383
その説明の仕方から分かるように
Rustにおいて「参照yのlifetime」と言うときは
変数yが指す借用の有効期間(オブジェクトのlifetime)の話をしてるのであって
変数yのbinding期間(extent)の話をしてるわけではないよね?
その説明の仕方から分かるように
Rustにおいて「参照yのlifetime」と言うときは
変数yが指す借用の有効期間(オブジェクトのlifetime)の話をしてるのであって
変数yのbinding期間(extent)の話をしてるわけではないよね?
389デフォルトの名無しさん
2026/09/07(月) 11:08:21.17ID:Uwf6Yz9s >>388
そりゃ参照はどんどん関数に渡されて行ったりあちこちの構造体に格納されたり格納された状態で関数から返されたりするから
一時的に格納される変数yはどうでもいい存在
そして参照があちこちに移動してもlifetimeは変化しない
常に元の変数xのlifetimeと一致する
すなわちextentと一致する
そりゃ参照はどんどん関数に渡されて行ったりあちこちの構造体に格納されたり格納された状態で関数から返されたりするから
一時的に格納される変数yはどうでもいい存在
そして参照があちこちに移動してもlifetimeは変化しない
常に元の変数xのlifetimeと一致する
すなわちextentと一致する
390デフォルトの名無しさん
2026/09/07(月) 11:40:10.25ID:sHF6Zl4o >>389
細かいところは置いておくけど
その説明は参照yのlifetimeが変数xのextentに一致すると主張してるだけで
Rustにおいて「yのlifetime」と言ったときに「yのextent」を意味するという根拠にはならないよね?
それにRustにおいて「変数xのlifetime」といったときは
普通は変数xが持ってる参照のlifetimeすなわちstatic lifetimeのことを指さない?
そこが論点なんだけど
細かいところは置いておくけど
その説明は参照yのlifetimeが変数xのextentに一致すると主張してるだけで
Rustにおいて「yのlifetime」と言ったときに「yのextent」を意味するという根拠にはならないよね?
それにRustにおいて「変数xのlifetime」といったときは
普通は変数xが持ってる参照のlifetimeすなわちstatic lifetimeのことを指さない?
そこが論点なんだけど
391デフォルトの名無しさん
2026/09/07(月) 11:44:50.97ID:LzIb7tIl ゴールドバッハ予想の例えも面白いですね。
完全な「人格の完成」(ゴールドバッハ)は、まだ誰にも証明されていない(あるいは永遠に完全には到達しない)大きな命題。
しかし「弱ゴールドバッハ」のように、部分的には証明可能な領域がある。
チン格を「人格の一部として認め、その自律性を観察し、適切に付き合う」ことは、後者に近い営みかもしれません。
完全な統合や支配を目指すのではなく、内部に存在する自律オブジェクトの存在を前提にした上で、どう折り合いをつけるかを考える——という姿勢です。
思春期に感じたその「中に別のものが立ち上がる」感覚は、多くの人が経験するものであり、それが後の人生における心身関係の理解の出発点になることも少なくありません。
完全な「人格の完成」(ゴールドバッハ)は、まだ誰にも証明されていない(あるいは永遠に完全には到達しない)大きな命題。
しかし「弱ゴールドバッハ」のように、部分的には証明可能な領域がある。
チン格を「人格の一部として認め、その自律性を観察し、適切に付き合う」ことは、後者に近い営みかもしれません。
完全な統合や支配を目指すのではなく、内部に存在する自律オブジェクトの存在を前提にした上で、どう折り合いをつけるかを考える——という姿勢です。
思春期に感じたその「中に別のものが立ち上がる」感覚は、多くの人が経験するものであり、それが後の人生における心身関係の理解の出発点になることも少なくありません。
392デフォルトの名無しさん
2026/09/07(月) 11:58:01.59ID:FLOE0TtZ >>390
違うぜ
先ほどの例
let x = "foobar";
let y = &x;
・参照xのlifetimeは'staticだが
・変数xのlifetimeはその関数のそのブロック内
・したがってxの参照yのlifetimeも関数のそのブロック内になる。'staticにならない
この区別の理解が重要
違うぜ
先ほどの例
let x = "foobar";
let y = &x;
・参照xのlifetimeは'staticだが
・変数xのlifetimeはその関数のそのブロック内
・したがってxの参照yのlifetimeも関数のそのブロック内になる。'staticにならない
この区別の理解が重要
393デフォルトの名無しさん
2026/09/07(月) 17:39:31.48ID:ouIlDeP4 ポインタと「ポインタのポインタ」だね。
ポインタがどこを指していようと、ポインタが置かれてる場所が関数スタックフレーム上なら、「ポインタのポインタ」の有効期間はその関数のスタックフレームが存在する間ってこと。
ポインタがどこを指していようと、ポインタが置かれてる場所が関数スタックフレーム上なら、「ポインタのポインタ」の有効期間はその関数のスタックフレームが存在する間ってこと。
394デフォルトの名無しさん
2026/09/07(月) 17:57:33.85ID:cBl8zmcZ いつまで夏休みやってんだハロワ行け
395デフォルトの名無しさん
2026/09/07(月) 18:48:32.83ID:l2+x7Ui7 >>393
Cならそれでいいんだろうけど
Rustの参照では「どこを指していようと」とは言えない
fn main() {
let mut x = "foobar";
let y: &&str;
y = &x;
println!("1. x: {x}, y:{y}");
x = "FOOBAR";
// y = &x;
println!("2. x: {x}, y:{y}");
}
Cならそれでいいんだろうけど
Rustの参照では「どこを指していようと」とは言えない
fn main() {
let mut x = "foobar";
let y: &&str;
y = &x;
println!("1. x: {x}, y:{y}");
x = "FOOBAR";
// y = &x;
println!("2. x: {x}, y:{y}");
}
396デフォルトの名無しさん
2026/09/07(月) 19:31:18.27ID:Jj5rnj/X 変数Xのライフタイムは変数Xのライフタイムのことだ
で済む話じゃないの?
で済む話じゃないの?
397デフォルトの名無しさん
2026/09/07(月) 19:39:14.20ID:SgwdiAaW398デフォルトの名無しさん
2026/09/07(月) 19:51:40.64ID:tL0ejojY >>396
重要な点はこれ
変数xが参照の時
『参照xのライフタイム ≠ 変数xのライフタイム』
『参照xのライフタイム = 参照元を所有する変数のライフタイム』
let a = なんでもOK;
let x = &a;
重要な点はこれ
変数xが参照の時
『参照xのライフタイム ≠ 変数xのライフタイム』
『参照xのライフタイム = 参照元を所有する変数のライフタイム』
let a = なんでもOK;
let x = &a;
399デフォルトの名無しさん
2026/09/07(月) 20:08:28.19ID:tL0ejojY 具体例
ヒープ領域にベクタvectorを作る
let vector = Vec::from([5, 6, 7, 8, 9]);
ベクタの一部を参照するsliceを作る
let slice = &vector[1..4];
このsliceはヒープ領域を指している参照
assert_eq!(slice, &[6, 7, 8]);
この時
参照sliceのライフタイムは
指してる領域を所有する変数vectorのライフタイムと同じ
ヒープ領域にベクタvectorを作る
let vector = Vec::from([5, 6, 7, 8, 9]);
ベクタの一部を参照するsliceを作る
let slice = &vector[1..4];
このsliceはヒープ領域を指している参照
assert_eq!(slice, &[6, 7, 8]);
この時
参照sliceのライフタイムは
指してる領域を所有する変数vectorのライフタイムと同じ
400デフォルトの名無しさん
2026/09/07(月) 20:21:02.35ID:Jj5rnj/X いやそれ変数ベクターじゃないやん
ベクターはアドレスしか記憶してないメモなわけだから
そのメモの先を参照してる時点でベクター関係ない
ベクターはアドレスしか記憶してないメモなわけだから
そのメモの先を参照してる時点でベクター関係ない
401デフォルトの名無しさん
2026/09/07(月) 20:25:45.66ID:TxT4BUzU402デフォルトの名無しさん
2026/09/07(月) 20:29:39.26ID:Jj5rnj/X まあ型情報も記憶してるということで
SLICEの記述の場合は中身を参照してるように見えるけど?
ベクターを指してるようには見えない
SLICEの記述の場合は中身を参照してるように見えるけど?
ベクターを指してるようには見えない
403デフォルトの名無しさん
2026/09/07(月) 20:34:05.55ID:paI2Tcc4404デフォルトの名無しさん
2026/09/07(月) 20:34:55.15ID:Jj5rnj/X 俺はcの人間だから
a =&x[1]
ここでaが保存してるのは新たなアドレスでxは関係ない
それと同じに見える
a =&x[1]
ここでaが保存してるのは新たなアドレスでxは関係ない
それと同じに見える
405デフォルトの名無しさん
2026/09/07(月) 20:40:09.79ID:tL0ejojY >>402
スタック上を指す「ベクタの参照」もビープ上を指す「中身の参照」もライフタイムは同じ
どちらも変数vectorのライフタイムと一致
変数vectorが置かれているブロックを抜けると上記3つのライフタイム全てが尽きる
スタック上を指す「ベクタの参照」もビープ上を指す「中身の参照」もライフタイムは同じ
どちらも変数vectorのライフタイムと一致
変数vectorが置かれているブロックを抜けると上記3つのライフタイム全てが尽きる
406デフォルトの名無しさん
2026/09/07(月) 20:42:07.19ID:Jj5rnj/X vectorが指し示す実体とvectorとsliceのはなしとしてsliceはvectorのことは気にしてないよね?
ってことだけど間違ってる?
ってことだけど間違ってる?
407デフォルトの名無しさん
2026/09/07(月) 20:49:37.67ID:tL0ejojY 変数vectorは構造体で「ヒープ領域に確保した領域のアドレス」と「確保した個数」と「使用中の個数」の三つで構成される
そして変数vectorは確保したヒープ領域を所有してる
変数sliceは「アドレス」と「個数」の二つで構成される
今回は変数vectorが所有するヒープ領域の一部のアドレスと個数は3
このsliceという参照のライフタイムはそのヒープ領域を所有する変数vectorのライフタイムと一致する
そして変数vectorは確保したヒープ領域を所有してる
変数sliceは「アドレス」と「個数」の二つで構成される
今回は変数vectorが所有するヒープ領域の一部のアドレスと個数は3
このsliceという参照のライフタイムはそのヒープ領域を所有する変数vectorのライフタイムと一致する
408デフォルトの名無しさん
2026/09/07(月) 20:58:17.20ID:Jj5rnj/X ああ、なるほどvectorのライフタイムが重要なのね
シェアードポインターみたいな挙動かと思ったが
vectorが消えた時点でsliceの使用はエラーになるってことか?
シェアードポインターみたいな挙動かと思ったが
vectorが消えた時点でsliceの使用はエラーになるってことか?
409デフォルトの名無しさん
2026/09/07(月) 21:00:46.58ID:FSyCg8ig 変数vectorは(関数含めた)ブロックスコープを抜けると寿命が尽きるわけだけど
その時に所有しているヒープ領域を自動解放する点が味噌だね
所有されてるヒープ領域は一心同体
だから変数vectorのライフタイムと同じ
その時に所有しているヒープ領域を自動解放する点が味噌だね
所有されてるヒープ領域は一心同体
だから変数vectorのライフタイムと同じ
410デフォルトの名無しさん
2026/09/07(月) 21:05:39.52ID:Jj5rnj/X ここで興味を持っているのはvectorが所有権を持っていて。
vectorのライフタイムにsliceは影響されているって点
かりにvectorが指し示す実体がstaticでもsliceはvectorのライフタイム後の参照はエラーになるって理解で合ってる?
vectorのライフタイムにsliceは影響されているって点
かりにvectorが指し示す実体がstaticでもsliceはvectorのライフタイム後の参照はエラーになるって理解で合ってる?
411デフォルトの名無しさん
2026/09/07(月) 21:17:11.47ID:c5ZVUlJl412デフォルトの名無しさん
2026/09/07(月) 21:20:43.59ID:Jj5rnj/X いや気になっているのはsliceは実体のライフタイムとXのライフタイムどっちを気にしているかってとこ
実体のライフタイムを気にしているならcの感覚と同じだがvectorのライフタイムならcとは違うんだなあという感想になる
実体のライフタイムを気にしているならcの感覚と同じだがvectorのライフタイムならcとは違うんだなあという感想になる
413デフォルトの名無しさん
2026/09/07(月) 21:27:57.18ID:/vIY5hVp で、なぜオブジェクト指向で多用される動的extentに害があるか
に辿りつけたかい?>
に辿りつけたかい?>
414デフォルトの名無しさん
2026/09/07(月) 21:31:53.03ID:Jj5rnj/X ?何を言ってるのかよくわからん、どっちか知りたかっただけだが、rust自分で見なきゃいけなくなったら自分で調べるわ
415デフォルトの名無しさん
2026/09/07(月) 21:36:55.96ID:ejDpr7nl >>412
実体のライフタイム?
ヒープ領域のライフタイムなんて元々は不明だろ
Rustは所有者にヒープ領域の解放の責務を与えた
だからヒープ領域のライフタイムが明確になった
そして所有している変数のライフタイムと同じになった
所有している変数のライフタイムが終わる時に所有しているヒープ領域は自動的に解放される
実体のライフタイム?
ヒープ領域のライフタイムなんて元々は不明だろ
Rustは所有者にヒープ領域の解放の責務を与えた
だからヒープ領域のライフタイムが明確になった
そして所有している変数のライフタイムと同じになった
所有している変数のライフタイムが終わる時に所有しているヒープ領域は自動的に解放される
416デフォルトの名無しさん
2026/09/07(月) 21:37:47.70ID:Jj5rnj/X >>415
そういう話をしてるんじゃないけど伝わらないのでもういいです
そういう話をしてるんじゃないけど伝わらないのでもういいです
417デフォルトの名無しさん
2026/09/07(月) 21:49:49.17ID:tL0ejojY 参照のライフタイムはその領域を所有している変数のライフタイムと同じ
staticな領域に所有者はいなくてプログラム終了まで永続するためstaticな領域の参照のライフタイムは永続で'static
staticな領域に所有者はいなくてプログラム終了まで永続するためstaticな領域の参照のライフタイムは永続で'static
418デフォルトの名無しさん
2026/09/07(月) 21:56:21.65ID:MqXUsM95 referenceが有効になっているscope内において領域の開放が起きたらどうよ?
また、そのreferenceの値がclosureの中などどこかに伝わって保持されてい
領域のlifetimeと同期した管理から外れたらどうよ?
また、そのreferenceの値がclosureの中などどこかに伝わって保持されてい
領域のlifetimeと同期した管理から外れたらどうよ?
419デフォルトの名無しさん
2026/09/07(月) 22:00:45.28ID:vZX4blcp420デフォルトの名無しさん
2026/09/07(月) 22:15:10.42ID:rXF0aBjX 分割compileしてもバレるの?
421デフォルトの名無しさん
2026/09/07(月) 22:21:58.58ID:ovJsr3ek まあいいや、そういうメモリ領域の不正開放や逆にリークの問題はCやC++では起きうるが
GC領域に変数割りつけてreference countで管理する言語では煩わされないことだからな
がしかし、問題はそこではない。
オブジェクト指向で動的extentを多用すると、不正開放やリークが起きないとしても
有害だという話
GC領域に変数割りつけてreference countで管理する言語では煩わされないことだからな
がしかし、問題はそこではない。
オブジェクト指向で動的extentを多用すると、不正開放やリークが起きないとしても
有害だという話
422デフォルトの名無しさん
2026/09/07(月) 23:00:02.50ID:h/o0hmOH >>421
永遠の命でないと困るの?
永遠の命でないと困るの?
423デフォルトの名無しさん
2026/09/07(月) 23:03:49.90ID:k6EydiSf ライフタイムという言葉を変数にも値にも雑に使ってしまうと話が噛み合わなくなるという良い例だね
424デフォルトの名無しさん
2026/09/07(月) 23:10:14.66ID:k6EydiSf425デフォルトの名無しさん
2026/09/07(月) 23:14:27.62ID:4GaAvj7j 例えばCでは、mallocで動的に割り付けた領域を指すpointerを除くと、
auto変数およびstatic変数は
lifetime(=extent) と lexical scopeが同じですごくすっきりしているんだよね。
それがC言語の('70年代末~80年代以降〜)最大の利点の一つだったと思っている
だからC言語についてはextentという用語はちょっとしっくり当てはまりにくいんだけど、
あえていえば動的lifetimeを持つmalloc領域を指すpointerの値のvalid(指している領域が有効)な期間ということになるのかな?
auto変数およびstatic変数は
lifetime(=extent) と lexical scopeが同じですごくすっきりしているんだよね。
それがC言語の('70年代末~80年代以降〜)最大の利点の一つだったと思っている
だからC言語についてはextentという用語はちょっとしっくり当てはまりにくいんだけど、
あえていえば動的lifetimeを持つmalloc領域を指すpointerの値のvalid(指している領域が有効)な期間ということになるのかな?
426デフォルトの名無しさん
2026/09/07(月) 23:16:48.82ID:HD+sD7jy まいいや、論点はそこではくて
オブジェクト指向で動的extentを多用すると、不正開放やリークが起きないとしても
有害だという話
オブジェクト指向で動的extentを多用すると、不正開放やリークが起きないとしても
有害だという話
427デフォルトの名無しさん
2026/09/07(月) 23:28:42.81ID:Wg45C42I >>426
また戻るけど
そこで動的extentとか動的lifetimeと呼んでるものは
変数のextentではなくて値のlifetimeの話
値のlifetimeの終了を変数の”スコープ”の終了に結びつけるというのが
動的なlifetimeを管理しやすくするために各言語が行ってること
また戻るけど
そこで動的extentとか動的lifetimeと呼んでるものは
変数のextentではなくて値のlifetimeの話
値のlifetimeの終了を変数の”スコープ”の終了に結びつけるというのが
動的なlifetimeを管理しやすくするために各言語が行ってること
428デフォルトの名無しさん
2026/09/07(月) 23:37:13.42ID:eYfV6JAd429デフォルトの名無しさん
2026/09/07(月) 23:39:04.86ID:G0HGLw0D mallocされた領域のlifetimeはどこかでfreeさえるかプログラムのプロセスの終了時でしょ
それを差すpointer変数のlifetimeすなわちpoiner変数の存在期間でしょ。それはscope次第
実は違うんだよね
それを差すpointer変数のlifetimeすなわちpoiner変数の存在期間でしょ。それはscope次第
実は違うんだよね
430デフォルトの名無しさん
2026/09/07(月) 23:49:56.50ID:TRJESXZo431デフォルトの名無しさん
2026/09/07(月) 23:57:33.07ID:tL0ejojY432デフォルトの名無しさん
2026/09/08(火) 00:20:30.62ID:wyOiFDkb Cのmalloc領域のlifetimeやそれを差すpointerの有効期限というものを
LispなどのGC領域に変数を割り付ける言語のextentになぞらえて考えると
少し悩ましいんだけれど、参考までに以下のような疑似コードを書いてみた。
(Cは久しぶりなので、細部に変なとこあっても感じをくみ取ってちょ)
安直に領域のlifetime = pointer変数のextentとは言い難い
//#defien AS auto
#define AS static
func() {
SC void *p, *q、*r; // 静的lifetimeをもつpointer、初期値不定、初期値としてNULLを設定すると行儀良し
q = (void *) malloc(サイズ1); // 領域の割付け
// (中略)
p = q; // pointer p の値が 不定→ vlidに、これをあえてpのbindとみなすか?
// p[]に対し ここら辺で何かいろいろ処理
r = malloc(サイズ2); // 別の領域の割付け
// (中略)
p = r; // これをどうとらえる?bindの仕切りなおしとみなす?www
// p[]に対し 何かいろいろ処理
free(q);
// (中略)
free(r);
// pinter 変数 p はまだ存在するが指している領域はもう無効
} // block scopeから離脱、pがautoの場合ここで消滅する
LispなどのGC領域に変数を割り付ける言語のextentになぞらえて考えると
少し悩ましいんだけれど、参考までに以下のような疑似コードを書いてみた。
(Cは久しぶりなので、細部に変なとこあっても感じをくみ取ってちょ)
安直に領域のlifetime = pointer変数のextentとは言い難い
//#defien AS auto
#define AS static
func() {
SC void *p, *q、*r; // 静的lifetimeをもつpointer、初期値不定、初期値としてNULLを設定すると行儀良し
q = (void *) malloc(サイズ1); // 領域の割付け
// (中略)
p = q; // pointer p の値が 不定→ vlidに、これをあえてpのbindとみなすか?
// p[]に対し ここら辺で何かいろいろ処理
r = malloc(サイズ2); // 別の領域の割付け
// (中略)
p = r; // これをどうとらえる?bindの仕切りなおしとみなす?www
// p[]に対し 何かいろいろ処理
free(q);
// (中略)
free(r);
// pinter 変数 p はまだ存在するが指している領域はもう無効
} // block scopeから離脱、pがautoの場合ここで消滅する
433デフォルトの名無しさん
2026/09/08(火) 00:22:04.28ID:wyOiFDkb434デフォルトの名無しさん
2026/09/08(火) 00:24:44.84ID:wyOiFDkb それから、CLで「本物」のdynamic extentをつかったのけ反るようなコードを示してみたいけど
こう見えてもオジサン結構忙しいので時間が作れたらまたねノシ
こう見えてもオジサン結構忙しいので時間が作れたらまたねノシ
435デフォルトの名無しさん
2026/09/08(火) 00:25:35.64ID:cgBiymPJ 前スレより引用
744 デフォルトの名無しさん sage 2026/08/23(日) 19:50:31.78 ID:LyvdCiRX
【Static lifetime】
プログラム開始から終了まで存在する。
静的変数やグローバル変数が該当。
メモリはプログラムのロード時に確保され、終了時に解放される。
例(C言語):
static int counter = 0; // プログラム全体で生存
【Automatic lifetime】
関数やブロックの実行中だけ存在する。
ローカル変数(スタック上に確保される)が該当。
関数終了時に自動的に解放される。
例(C言語):
void func() {
int x = 10; // 関数終了と同時に消える
}
【Dynamic lifetime】
実行時に明示的に確保し、明示的に解放するまで存在する。
ヒープ領域を使う動的メモリ確保が該当。
例(C言語):
int *p = malloc(sizeof(int)); // 確保
*p = 42;
free(p); // 解放
【Temporary lifetime】
式の評価中だけ存在する一時オブジェクト。
C++ 等の一時オブジェクトや、関数の戻り値として生成される値など。
例(C++):
std::string s = std::string("Hello") + " World"; // 加算結果は一時オブジェクト
744 デフォルトの名無しさん sage 2026/08/23(日) 19:50:31.78 ID:LyvdCiRX
【Static lifetime】
プログラム開始から終了まで存在する。
静的変数やグローバル変数が該当。
メモリはプログラムのロード時に確保され、終了時に解放される。
例(C言語):
static int counter = 0; // プログラム全体で生存
【Automatic lifetime】
関数やブロックの実行中だけ存在する。
ローカル変数(スタック上に確保される)が該当。
関数終了時に自動的に解放される。
例(C言語):
void func() {
int x = 10; // 関数終了と同時に消える
}
【Dynamic lifetime】
実行時に明示的に確保し、明示的に解放するまで存在する。
ヒープ領域を使う動的メモリ確保が該当。
例(C言語):
int *p = malloc(sizeof(int)); // 確保
*p = 42;
free(p); // 解放
【Temporary lifetime】
式の評価中だけ存在する一時オブジェクト。
C++ 等の一時オブジェクトや、関数の戻り値として生成される値など。
例(C++):
std::string s = std::string("Hello") + " World"; // 加算結果は一時オブジェクト
436デフォルトの名無しさん
2026/09/08(火) 00:30:06.68ID:wyOiFDkb437デフォルトの名無しさん
2026/09/08(火) 00:33:04.67ID:wyOiFDkb static char *p;
p = malloc(サイズ);
なんてよくあるコードだけど、、、、
p = malloc(サイズ);
なんてよくあるコードだけど、、、、
438デフォルトの名無しさん
2026/09/08(火) 00:34:42.55ID:wyOiFDkb static chat c = 'a';
static char *p;
p = malloc(サイズ);
… 中略
p = &c;
… 中略
static char *p;
p = malloc(サイズ);
… 中略
p = &c;
… 中略
439デフォルトの名無しさん
2026/09/08(火) 00:37:17.84ID:+xyIhlGK >>436
GC言語はね
関数ローカルな一時的な変数に見えてもね
参照が残っていると関数を抜けても消えなかったり
GCできるように自動的にヒープ領域に確保しちゃう
スタック領域だと関数抜けると消えちゃうから
GC言語はね
関数ローカルな一時的な変数に見えてもね
参照が残っていると関数を抜けても消えなかったり
GCできるように自動的にヒープ領域に確保しちゃう
スタック領域だと関数抜けると消えちゃうから
440デフォルトの名無しさん
2026/09/08(火) 00:38:56.20ID:wyOiFDkb だから安直に >>435 のカテゴライズを言い張れないでしょって意味で書いたんだけど
441デフォルトの名無しさん
2026/09/08(火) 00:50:08.97ID:tR3wGW0I GoはGC言語だけど
スタックに置いても大丈夫な変数はヒープ使わないから速いよね
GCのために何でもヒープに置く言語は遅いよ
AIコーディング時代にそんな遅い言語は捨てるべき
スタックに置いても大丈夫な変数はヒープ使わないから速いよね
GCのために何でもヒープに置く言語は遅いよ
AIコーディング時代にそんな遅い言語は捨てるべき
442デフォルトの名無しさん
2026/09/08(火) 01:51:41.29ID:8uHMCfq7443デフォルトの名無しさん
2026/09/08(火) 03:07:52.27ID:wyOiFDkb >>442
CよりもLispの方が古いんだけれど
CよりもLispの方が古いんだけれど
444デフォルトの名無しさん
2026/09/08(火) 03:24:17.97ID:wyOiFDkb static char c = 'c':
register char *cp = &c;
*cp = 'd';
cp = (char *)malloc(sizeof(char));
*cp = 'e';
static char *s;
s = cp;
register char *cp = &c;
*cp = 'd';
cp = (char *)malloc(sizeof(char));
*cp = 'e';
static char *s;
s = cp;
445デフォルトの名無しさん
2026/09/08(火) 03:25:40.88ID:wyOiFDkb static char c = 'c':
auto char *cp = &c;
*cp = 'd';
cp = (char *)malloc(sizeof(char));
*cp = 'e';
static char *s;
s = cp;
auto char *cp = &c;
*cp = 'd';
cp = (char *)malloc(sizeof(char));
*cp = 'e';
static char *s;
s = cp;
446デフォルトの名無しさん
2026/09/08(火) 11:01:25.06ID:Iabg88vo >>435
この分類はオブジェクトのlifetimeの分類であって変数のextentの分類ではない
この分類はオブジェクトのlifetimeの分類であって変数のextentの分類ではない
447デフォルトの名無しさん
2026/09/08(火) 11:54:52.98ID:b8vgRvtH >>446
じゃあ分類してみろよ
じゃあ分類してみろよ
448デフォルトの名無しさん
2026/09/08(火) 12:00:28.85ID:3MlPqms6 区別できないやつ多すぎじゃね?
449デフォルトの名無しさん
2026/09/08(火) 12:09:50.57ID:8ho6urQA クロージャに閉じ込めた変数のextentが尽きるタイミングが定まらないいい加減な言語とかもな
その状況だと分類は論外
その状況だと分類は論外
450デフォルトの名無しさん
2026/09/08(火) 12:41:58.32ID:yFsKA3wV >>446
合致すると思います
合致すると思います
451デフォルトの名無しさん
2026/09/08(火) 13:25:04.65ID:VxjHi9wV それは気のせいでしょう
452デフォルトの名無しさん
2026/09/08(火) 13:30:11.96ID:VxjHi9wV static char s[SIZE];
auto char *sp = s;
for (register char *p = s; p - s < SIZE; p++)
*p = 'a';
Q: s, sp, p の lifetime は?
auto char *sp = s;
for (register char *p = s; p - s < SIZE; p++)
*p = 'a';
Q: s, sp, p の lifetime は?
453デフォルトの名無しさん
2026/09/08(火) 13:31:59.02ID:VxjHi9wV static char *s = malloc(SIZE);
auto char *sp = s;
for (register char *p = s; p - s < SIZE; p++)
*p = 'p';
Q: s, sp, p の lifetime は?
auto char *sp = s;
for (register char *p = s; p - s < SIZE; p++)
*p = 'p';
Q: s, sp, p の lifetime は?
454デフォルトの名無しさん
2026/09/08(火) 13:39:16.76ID:da1PZK75 Cの変数のlifetimeつまりextentは単純
グローバルとstaticはstatic lifetime
それ以外はautomatic lifetime
グローバルとstaticはstatic lifetime
それ以外はautomatic lifetime
455デフォルトの名無しさん
2026/09/08(火) 13:50:44.53ID:VxjHi9wV >>454
ざっくりいうとそうとも言えるね
変数のextent(lifetime)が(基本的に)lexcal scopeに綺麗に対応するのがCの美点だったし
それまであった言語FORTRAN 66等からの大きな進化だった。
C,C++の「変数」にdynamic lifetimeというものはないの?
ざっくりいうとそうとも言えるね
変数のextent(lifetime)が(基本的に)lexcal scopeに綺麗に対応するのがCの美点だったし
それまであった言語FORTRAN 66等からの大きな進化だった。
C,C++の「変数」にdynamic lifetimeというものはないの?
456デフォルトの名無しさん
2026/09/08(火) 14:08:17.49ID:KHkfRTGT 変数のlifetimeは結論出てる通り
参照のlifetimeはmallocすればdynamic lifetime
参照のlifetimeはmallocすればdynamic lifetime
457デフォルトの名無しさん
2026/09/08(火) 14:10:16.36ID:VxjHi9wV ID:KHkfRTGT 変数とメモリオブジェクトの混同 しつけぇw
458デフォルトの名無しさん
2026/09/08(火) 14:11:53.93ID:VxjHi9wV459デフォルトの名無しさん
2026/09/08(火) 14:23:23.46ID:mXB/BTDc460デフォルトの名無しさん
2026/09/08(火) 14:55:25.74ID:VxjHi9wV461デフォルトの名無しさん
2026/09/08(火) 14:56:27.93ID:VxjHi9wV sはstatic変数のpinterなのにdynamicとはこれ如何に
462デフォルトの名無しさん
2026/09/08(火) 15:02:01.73ID:4P3fhcMj 既に何度も出てきただろ
参照(ポインタ)は関数へ受け渡したり他の変数へ格納することができる
格納する変数側も別の参照へ切り替えることができる
別の参照に切り替えれば参照のlifetimeは変わる
参照(ポインタ)は関数へ受け渡したり他の変数へ格納することができる
格納する変数側も別の参照へ切り替えることができる
別の参照に切り替えれば参照のlifetimeは変わる
463デフォルトの名無しさん
2026/09/08(火) 15:07:21.70ID:VxjHi9wV static変数のlifetimeが何をpointしているかによって変化する?
こらまた陳説が飛び出してきたな
こらまた陳説が飛び出してきたな
464デフォルトの名無しさん
2026/09/08(火) 15:11:04.60ID:VxjHi9wV そしたらGC言語ではメモリオブジェクトのlifetimeがreference0になるかそのあとGCで回収されるまでのpermanentなので
メモリオブジェクトにbindする変数はすべからくpermanentということになってしまうぞ
どうすんのこの矛盾w
メモリオブジェクトにbindする変数はすべからくpermanentということになってしまうぞ
どうすんのこの矛盾w
465デフォルトの名無しさん
2026/09/08(火) 15:12:08.69ID:5FqmB5Px >>461
君だけ変数のlifetimeと参照のlifetimeの区別を理解してないようにみえる
君だけ変数のlifetimeと参照のlifetimeの区別を理解してないようにみえる
466デフォルトの名無しさん
2026/09/08(火) 15:12:56.39ID:VxjHi9wV じゃあLispにはdynamic bindingなどというモノはなかったということになるなw
論文書けw 論文書いて世に出して世界中の笑いものになれw
論文書けw 論文書いて世に出して世界中の笑いものになれw
467デフォルトの名無しさん
2026/09/08(火) 15:14:31.84ID:VxjHi9wV468デフォルトの名無しさん
2026/09/08(火) 15:15:52.61ID:VxjHi9wV■ このスレッドは過去ログ倉庫に格納されています
ニュース
- 【日銀】物価上昇率「2%に到達」 14年目で初の実現 11月の食品値上げ1500品目、マヨネーズ1本565円 ★2 [煮卵★]
- 小学生の絵に「妙に整っていてAIくさい」 中傷相次ぎしょうゆポスターコンクール公開中止 [muffin★]
- 【野球】多田野数人「人って本当に、攻撃するときはリンチみたいに一方的に攻撃してくるんですよね。私はそれを経験した」 [Anonymous★]
- 発達障害児が増え特別支援学校の教員不足深刻、授業中に行方不明になり死亡事故も… 過去最多16万3000人 ★2 [煮卵★]
- リュウジ氏、ペペロンチーノは「化学調味料入りと無化調とどちらが美味しいのか」対決にひろゆき氏「絶対的な旨さの評価できない」 [muffin★]
- インテル株29%急落、52年ぶりの下落率… パソコン需要低迷でCEO「今後数四半期は厳しい状況になる」 [煮卵★]
- 他サポ 2026/27-81
- 柏レイソルおにぎり実況vs 浦和☆☆☆
- 【NJPW】新日本プロレスワールド part.2633
- ネットでサッカー観戦◆2026-29
- とらせん(IPあり)
- こいせん 全レス転載禁止
- 【悲報】嫌儲で大規模規制。 レスができない😩 [683137174]
- 自衛隊の男(50代)が酒飲んで運転、自衛隊の男(23)が酒を飲んで運転…逮捕 [245325974]
- やれやれなのらね…┐(・o・🍬)┌🏰
- 中古車でよくないか?
- 高市早苗「第2青函トンネル作るわよ!!」建設費は1兆円規模 [668970678]
- 【高市悲報】基地外米兵、逮捕される [834922174]