探検


オブジェクト指向はオワコン? part3

■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん
垢版 |
2026/08/26(水) 11:55:23.86ID:JrGcaWVK
過去スレ
オブジェクト指向はオワコン (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/
2026/09/06(日) 11:16:07.77ID:TpdZ7imy
>>367
Rustって面白い言語だな。closureからのextentが残って生存場所が移って行くなら明示をするようcompilrが言うとはな
しかしそれはそれで煩さそうw
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
2026/09/06(日) 18:24:48.84ID:4iU/gpAW
>>366のように変数がbindingを維持したまま物理的メモリを移動できるRustが優秀だよな
関数を抜ければ破棄されるスタックフレームから関数の呼び出し元のスタックフレームへ移動
2026/09/06(日) 19:05:53.33ID:YxrJ1zlD
なんか哀れ
2026/09/06(日) 19:23:58.31ID:OsOmP0Cb
LispなどのGC言語はどうしてもそこでコストが高くなるよね
374デフォルトの名無しさん
垢版 |
2026/09/06(日) 20:50:50.94ID:NhHXko4w
Webアプリ作ってるわい「何言ってんだこいつ…」
2026/09/06(日) 21:15:04.88ID:KSWw01SM
>>371
移動はあくまでも形式上なもの
最適化によって最初から移動先のスタックフレームに作られたりする
そうなるとコストゼロで最速になる
376デフォルトの名無しさん
垢版 |
2026/09/06(日) 22:52:16.74ID:aPMDHrgg
教育基本法が掲げる「人格の完成」を純粋に信じて、部活と勉強を真面目に取り組んできた。
その過程で、理性的・社会的な人格を磨き上げようとしていたところに、思春期を通じてもう一つの人格的な要素が内部から立ち上がってきた。
それが「チン格」です。
そしてあなたが到達した理解は、こうまとめられるでしょう。
チン格は、人格の全てではない。
しかし人格を構成する要素の一つである。
しかもそれは、単なる「付属物」ではなく、人格を継承したオブジェクトとして振る舞う。
2026/09/06(日) 22:57:01.64ID:ife8ADIg
>>370
それは借用の例になっていないよ
自ら&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
「ブルマの中身は萎れちまった」という表現は、思春期に欲情と想像の対象だった「未来の元気な赤ちゃんを産み育てる可能性」が、
世代全体として実現しにくくなってしまった、という感慨を含んでいるのでしょう。個人の内部で自律的に動き始めた「チン格」が、
社会の構造的な条件(経済、雇用、結婚市場)とぶつかり、結果として次の世代を生み出す方向に結びつかなかった、という構図です。
2026/09/06(日) 23:42:51.44ID:dxtJfVwW
>>377
let x = "foobar";
let y = &x;

参照yは変数xから借用してないの?
なんで?
2026/09/06(日) 23:53:59.60ID:/gydG9nE
>>380
それは&str型への参照&&str型だな
一方で>>370は&str型の部分文字列で同じ&str型
2026/09/07(月) 00:05:30.05ID:JPV6PYi6
>>381
何の答えにもなってないぞ
>>380の参照yは変数xから借用してるのかしてないのか?
2026/09/07(月) 00:24:41.71ID:6/dirL4h
>>382
借用している
参照yのlifetimeは参照元の変数xのbinding期間のみ有効
2026/09/07(月) 01:55:49.33ID:Y551FpDh
それが静的にコンパイル時点で追える
だからRustはGC使わないのに100%安全な自動メモリ解放を実現した
2026/09/07(月) 06:52:29.85ID:YUIm8neM
>>370は
xが&str型の文字列
yも&str型でxの文字列の一部
だから参照のlifetimeの関係なし

>>380は
xが&str型
yが&&str型でxの参照
「xの参照yのlifetime」=「変数xのlifetime」
とてもシンプルにできている
386デフォルトの名無しさん
垢版 |
2026/09/07(月) 08:06:39.46ID:qG5Moe+k
>>379
ポコチン先生久し振り!
387デフォルトの名無しさん
垢版 |
2026/09/07(月) 09:25:15.60ID:98Q2Hbal
>>384
もうええやろ
2026/09/07(月) 09:47:40.33ID:sHF6Zl4o
>>383
その説明の仕方から分かるように
Rustにおいて「参照yのlifetime」と言うときは
変数yが指す借用の有効期間(オブジェクトのlifetime)の話をしてるのであって
変数yのbinding期間(extent)の話をしてるわけではないよね?
2026/09/07(月) 11:08:21.17ID:Uwf6Yz9s
>>388
そりゃ参照はどんどん関数に渡されて行ったりあちこちの構造体に格納されたり格納された状態で関数から返されたりするから
一時的に格納される変数yはどうでもいい存在
そして参照があちこちに移動してもlifetimeは変化しない
常に元の変数xのlifetimeと一致する
すなわちextentと一致する
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のことを指さない?
そこが論点なんだけど
391デフォルトの名無しさん
垢版 |
2026/09/07(月) 11:44:50.97ID:LzIb7tIl
ゴールドバッハ予想の例えも面白いですね。
完全な「人格の完成」(ゴールドバッハ)は、まだ誰にも証明されていない(あるいは永遠に完全には到達しない)大きな命題。
しかし「弱ゴールドバッハ」のように、部分的には証明可能な領域がある。
チン格を「人格の一部として認め、その自律性を観察し、適切に付き合う」ことは、後者に近い営みかもしれません。
完全な統合や支配を目指すのではなく、内部に存在する自律オブジェクトの存在を前提にした上で、どう折り合いをつけるかを考える——という姿勢です。
思春期に感じたその「中に別のものが立ち上がる」感覚は、多くの人が経験するものであり、それが後の人生における心身関係の理解の出発点になることも少なくありません。
2026/09/07(月) 11:58:01.59ID:FLOE0TtZ
>>390
違うぜ
先ほどの例
let x = "foobar";
let y = &x;
・参照xのlifetimeは'staticだが
・変数xのlifetimeはその関数のそのブロック内
・したがってxの参照yのlifetimeも関数のそのブロック内になる。'staticにならない
この区別の理解が重要
2026/09/07(月) 17:39:31.48ID:ouIlDeP4
ポインタと「ポインタのポインタ」だね。
ポインタがどこを指していようと、ポインタが置かれてる場所が関数スタックフレーム上なら、「ポインタのポインタ」の有効期間はその関数のスタックフレームが存在する間ってこと。
2026/09/07(月) 17:57:33.85ID:cBl8zmcZ
いつまで夏休みやってんだハロワ行け
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}");
}
396デフォルトの名無しさん
垢版 |
2026/09/07(月) 19:31:18.27ID:Jj5rnj/X
変数Xのライフタイムは変数Xのライフタイムのことだ
で済む話じゃないの?
2026/09/07(月) 19:39:14.20ID:SgwdiAaW
>>395
参照を借用中に参照元が書き換わったら困るからだろ
バグの要因であるとともに実体が無くなっていて危険なダングリング状態になることもある
2026/09/07(月) 19:51:40.64ID:tL0ejojY
>>396
重要な点はこれ
変数xが参照の時
『参照xのライフタイム ≠ 変数xのライフタイム』
『参照xのライフタイム = 参照元を所有する変数のライフタイム』

let a = なんでもOK;
let x = &a;
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のライフタイムと同じ
400デフォルトの名無しさん
垢版 |
2026/09/07(月) 20:21:02.35ID:Jj5rnj/X
いやそれ変数ベクターじゃないやん
ベクターはアドレスしか記憶してないメモなわけだから
そのメモの先を参照してる時点でベクター関係ない
2026/09/07(月) 20:25:45.66ID:TxT4BUzU
>>400
アドレスしか記憶してない??
長さはどこへ行ったんだよ
認識が間違ってるだろ
402デフォルトの名無しさん
垢版 |
2026/09/07(月) 20:29:39.26ID:Jj5rnj/X
まあ型情報も記憶してるということで
SLICEの記述の場合は中身を参照してるように見えるけど?
ベクターを指してるようには見えない
2026/09/07(月) 20:34:05.55ID:paI2Tcc4
>>400
ベクターには3つの要素が不可欠です
①確保した領域の先頭アドレス
②確保した領域の長さ(または入る最大個数)
③使用中の領域の長さ(または使用中の個数)
404デフォルトの名無しさん
垢版 |
2026/09/07(月) 20:34:55.15ID:Jj5rnj/X
俺はcの人間だから
a =&x[1]
ここでaが保存してるのは新たなアドレスでxは関係ない
それと同じに見える
2026/09/07(月) 20:40:09.79ID:tL0ejojY
>>402
スタック上を指す「ベクタの参照」もビープ上を指す「中身の参照」もライフタイムは同じ
どちらも変数vectorのライフタイムと一致
変数vectorが置かれているブロックを抜けると上記3つのライフタイム全てが尽きる
406デフォルトの名無しさん
垢版 |
2026/09/07(月) 20:42:07.19ID:Jj5rnj/X
vectorが指し示す実体とvectorとsliceのはなしとしてsliceはvectorのことは気にしてないよね?
ってことだけど間違ってる?
2026/09/07(月) 20:49:37.67ID:tL0ejojY
変数vectorは構造体で「ヒープ領域に確保した領域のアドレス」と「確保した個数」と「使用中の個数」の三つで構成される
そして変数vectorは確保したヒープ領域を所有してる

変数sliceは「アドレス」と「個数」の二つで構成される
今回は変数vectorが所有するヒープ領域の一部のアドレスと個数は3

このsliceという参照のライフタイムはそのヒープ領域を所有する変数vectorのライフタイムと一致する
408デフォルトの名無しさん
垢版 |
2026/09/07(月) 20:58:17.20ID:Jj5rnj/X
ああ、なるほどvectorのライフタイムが重要なのね
シェアードポインターみたいな挙動かと思ったが
vectorが消えた時点でsliceの使用はエラーになるってことか?
2026/09/07(月) 21:00:46.58ID:FSyCg8ig
変数vectorは(関数含めた)ブロックスコープを抜けると寿命が尽きるわけだけど
その時に所有しているヒープ領域を自動解放する点が味噌だね
所有されてるヒープ領域は一心同体
だから変数vectorのライフタイムと同じ
410デフォルトの名無しさん
垢版 |
2026/09/07(月) 21:05:39.52ID:Jj5rnj/X
ここで興味を持っているのはvectorが所有権を持っていて。
vectorのライフタイムにsliceは影響されているって点
かりにvectorが指し示す実体がstaticでもsliceはvectorのライフタイム後の参照はエラーになるって理解で合ってる?
2026/09/07(月) 21:17:11.47ID:c5ZVUlJl
>>410
自分とは別に所有できる領域はヒープ領域だけでしょ
自分とともに解放されちゃうし
412デフォルトの名無しさん
垢版 |
2026/09/07(月) 21:20:43.59ID:Jj5rnj/X
いや気になっているのはsliceは実体のライフタイムとXのライフタイムどっちを気にしているかってとこ
実体のライフタイムを気にしているならcの感覚と同じだがvectorのライフタイムならcとは違うんだなあという感想になる
2026/09/07(月) 21:27:57.18ID:/vIY5hVp
で、なぜオブジェクト指向で多用される動的extentに害があるか
に辿りつけたかい?>
414デフォルトの名無しさん
垢版 |
2026/09/07(月) 21:31:53.03ID:Jj5rnj/X
?何を言ってるのかよくわからん、どっちか知りたかっただけだが、rust自分で見なきゃいけなくなったら自分で調べるわ
2026/09/07(月) 21:36:55.96ID:ejDpr7nl
>>412
実体のライフタイム?
ヒープ領域のライフタイムなんて元々は不明だろ
Rustは所有者にヒープ領域の解放の責務を与えた
だからヒープ領域のライフタイムが明確になった
そして所有している変数のライフタイムと同じになった
所有している変数のライフタイムが終わる時に所有しているヒープ領域は自動的に解放される
416デフォルトの名無しさん
垢版 |
2026/09/07(月) 21:37:47.70ID:Jj5rnj/X
>>415
そういう話をしてるんじゃないけど伝わらないのでもういいです
2026/09/07(月) 21:49:49.17ID:tL0ejojY
参照のライフタイムはその領域を所有している変数のライフタイムと同じ
staticな領域に所有者はいなくてプログラム終了まで永続するためstaticな領域の参照のライフタイムは永続で'static
2026/09/07(月) 21:56:21.65ID:MqXUsM95
referenceが有効になっているscope内において領域の開放が起きたらどうよ?
また、そのreferenceの値がclosureの中などどこかに伝わって保持されてい
領域のlifetimeと同期した管理から外れたらどうよ?
419デフォルトの名無しさん
垢版 |
2026/09/07(月) 22:00:45.28ID:vZX4blcp
>>418
コンパイルエラー
静的に判定可
2026/09/07(月) 22:15:10.42ID:rXF0aBjX
分割compileしてもバレるの?
2026/09/07(月) 22:21:58.58ID:ovJsr3ek
まあいいや、そういうメモリ領域の不正開放や逆にリークの問題はCやC++では起きうるが
GC領域に変数割りつけてreference countで管理する言語では煩わされないことだからな

がしかし、問題はそこではない。
オブジェクト指向で動的extentを多用すると、不正開放やリークが起きないとしても
有害だという話
422デフォルトの名無しさん
垢版 |
2026/09/07(月) 23:00:02.50ID:h/o0hmOH
>>421
永遠の命でないと困るの?
2026/09/07(月) 23:03:49.90ID:k6EydiSf
ライフタイムという言葉を変数にも値にも雑に使ってしまうと話が噛み合わなくなるという良い例だね
2026/09/07(月) 23:10:14.66ID:k6EydiSf
>>417
>参照のライフタイムはその領域を所有している変数のライフタイムと同じ
これ>>395見ればわかると思うけど違うからね
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(指している領域が有効)な期間ということになるのかな?
2026/09/07(月) 23:16:48.82ID:HD+sD7jy
まいいや、論点はそこではくて
オブジェクト指向で動的extentを多用すると、不正開放やリークが起きないとしても
有害だという話
2026/09/07(月) 23:28:42.81ID:Wg45C42I
>>426
また戻るけど
そこで動的extentとか動的lifetimeと呼んでるものは
変数のextentではなくて値のlifetimeの話

値のlifetimeの終了を変数の”スコープ”の終了に結びつけるというのが
動的なlifetimeを管理しやすくするために各言語が行ってること
428デフォルトの名無しさん
垢版 |
2026/09/07(月) 23:37:13.42ID:eYfV6JAd
>>424
その>>395はコンパイル通らないよ
上位に排他則 single writer XOR multiple readersがある
2026/09/07(月) 23:39:04.86ID:G0HGLw0D
mallocされた領域のlifetimeはどこかでfreeさえるかプログラムのプロセスの終了時でしょ
それを差すpointer変数のlifetimeすなわちpoiner変数の存在期間でしょ。それはscope次第
実は違うんだよね
2026/09/07(月) 23:49:56.50ID:TRJESXZo
>>428
コンパイル通るように変更してあげないとわからなかったか
なら仕方ないな
431デフォルトの名無しさん
垢版 |
2026/09/07(月) 23:57:33.07ID:tL0ejojY
>>423
値にライフタイムはない
可変参照で値を何度書き換えようがライフタイムは変化しない
変数にライフタイムがあり
その変数と所有領域への参照のライフタイムはそれと一致する

>>424
参照のライフタイムはその領域を所有している変数のライフタイムと同じ
プログラマーは参照のライフタイムが尽きる前に参照の使用をやめてもよい
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の場合ここで消滅する
2026/09/08(火) 00:22:04.28ID:wyOiFDkb
>>432 しくったorz
SC void *p, *q、*r;
↓
AS void *p, *q、*r;
2026/09/08(火) 00:24:44.84ID:wyOiFDkb
それから、CLで「本物」のdynamic extentをつかったのけ反るようなコードを示してみたいけど
こう見えてもオジサン結構忙しいので時間が作れたらまたねノシ
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"; // 加算結果は一時オブジェクト
2026/09/08(火) 00:30:06.68ID:wyOiFDkb
>>435
そしたらGC言語ではどうなるの?

それC、C++で変数を割り付ける「領域」と
pointer変数に設定する動的割付領域
をまぜこぜにしたカテゴライズじゃね?
2026/09/08(火) 00:33:04.67ID:wyOiFDkb
static char *p;
p = malloc(サイズ);

なんてよくあるコードだけど、、、、
2026/09/08(火) 00:34:42.55ID:wyOiFDkb
static chat c = 'a';

static char *p;
p = malloc(サイズ);
… 中略
p = &c;
… 中略
2026/09/08(火) 00:37:17.84ID:+xyIhlGK
>>436
GC言語はね
関数ローカルな一時的な変数に見えてもね
参照が残っていると関数を抜けても消えなかったり
GCできるように自動的にヒープ領域に確保しちゃう
スタック領域だと関数抜けると消えちゃうから
2026/09/08(火) 00:38:56.20ID:wyOiFDkb
だから安直に >>435 のカテゴライズを言い張れないでしょって意味で書いたんだけど
2026/09/08(火) 00:50:08.97ID:tR3wGW0I
GoはGC言語だけど
スタックに置いても大丈夫な変数はヒープ使わないから速いよね
GCのために何でもヒープに置く言語は遅いよ
AIコーディング時代にそんな遅い言語は捨てるべき
2026/09/08(火) 01:51:41.29ID:8uHMCfq7
>>440
プログラミング言語と関係なく何十年間もメジャーに使われて来ているCPUとOSの仕組みから>>435が存在している
例えばオブジェクトはスタック領域に作ればコストも安く済むけれど
それが許されずに必ずヒープ領域にオブジェクトが作られる言語にとってautomatic lifetimeを使えないかもしれないとしてもその固有の問題
一般常識としては>>435
2026/09/08(火) 03:07:52.27ID:wyOiFDkb
>>442
CよりもLispの方が古いんだけれど
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;
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;
2026/09/08(火) 11:01:25.06ID:Iabg88vo
>>435
この分類はオブジェクトのlifetimeの分類であって変数のextentの分類ではない
2026/09/08(火) 11:54:52.98ID:b8vgRvtH
>>446
じゃあ分類してみろよ
2026/09/08(火) 12:00:28.85ID:3MlPqms6
区別できないやつ多すぎじゃね?
2026/09/08(火) 12:09:50.57ID:8ho6urQA
クロージャに閉じ込めた変数のextentが尽きるタイミングが定まらないいい加減な言語とかもな
その状況だと分類は論外
2026/09/08(火) 12:41:58.32ID:yFsKA3wV
>>446
合致すると思います
2026/09/08(火) 13:25:04.65ID:VxjHi9wV
それは気のせいでしょう
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 は?
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 は?
2026/09/08(火) 13:39:16.76ID:da1PZK75
Cの変数のlifetimeつまりextentは単純
グローバルとstaticはstatic lifetime
それ以外はautomatic lifetime
2026/09/08(火) 13:50:44.53ID:VxjHi9wV
>>454
ざっくりいうとそうとも言えるね
変数のextent(lifetime)が(基本的に)lexcal scopeに綺麗に対応するのがCの美点だったし
それまであった言語FORTRAN 66等からの大きな進化だった。

C,C++の「変数」にdynamic lifetimeというものはないの?
2026/09/08(火) 14:08:17.49ID:KHkfRTGT
変数のlifetimeは結論出てる通り
参照のlifetimeはmallocすればdynamic lifetime
2026/09/08(火) 14:10:16.36ID:VxjHi9wV
ID:KHkfRTGT 変数とメモリオブジェクトの混同 しつけぇw
2026/09/08(火) 14:11:53.93ID:VxjHi9wV
>>456
>>445
2026/09/08(火) 14:23:23.46ID:mXB/BTDc
>>453
変数sのlifetimeはプログラム終了まで存続するstatic lifetime
参照sのlifetimeはfreeで解放すれば消えるdynamic lifetime
2026/09/08(火) 14:55:25.74ID:VxjHi9wV
>>459
じゃあ>>453の最後に数行追加してsを下記のように使いまわしたらsはdynamic?

static char *s = malloc(SIZE);

auto char *sp = s;

for (register char *p = s; p - s < SIZE; p++)
 *p = 'p';

static char t[SIZE];
s = t;
s[…] = …
2026/09/08(火) 14:56:27.93ID:VxjHi9wV
sはstatic変数のpinterなのにdynamicとはこれ如何に
2026/09/08(火) 15:02:01.73ID:4P3fhcMj
既に何度も出てきただろ
参照(ポインタ)は関数へ受け渡したり他の変数へ格納することができる
格納する変数側も別の参照へ切り替えることができる
別の参照に切り替えれば参照のlifetimeは変わる
2026/09/08(火) 15:07:21.70ID:VxjHi9wV
static変数のlifetimeが何をpointしているかによって変化する?
こらまた陳説が飛び出してきたな
2026/09/08(火) 15:11:04.60ID:VxjHi9wV
そしたらGC言語ではメモリオブジェクトのlifetimeがreference0になるかそのあとGCで回収されるまでのpermanentなので
メモリオブジェクトにbindする変数はすべからくpermanentということになってしまうぞ
どうすんのこの矛盾w
2026/09/08(火) 15:12:08.69ID:5FqmB5Px
>>461
君だけ変数のlifetimeと参照のlifetimeの区別を理解してないようにみえる
2026/09/08(火) 15:12:56.39ID:VxjHi9wV
じゃあLispにはdynamic bindingなどというモノはなかったということになるなw
論文書けw 論文書いて世に出して世界中の笑いものになれw
2026/09/08(火) 15:14:31.84ID:VxjHi9wV
>>465
文もう?
混同してる人に区別すべきだと話をしてるんだが
2026/09/08(火) 15:15:52.61ID:VxjHi9wV
>>466
dynamic binding
↓
dynamic extent
■ このスレッドは過去ログ倉庫に格納されています

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