- 1 名前:デフォルトの名無しさん [2015/08/31(月) 18:19:04.13 ID:NE3NvROE.net]
- C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。 IDE (VC++など)などの使い方の質問はその開発環境のスレに お願いします。 前スレ C++相談室 part118 peace.2ch.net/test/read.cgi/tech/1435970316/ このスレもよろしくね。 【初心者歓迎】C/C++室 Ver.97【環境依存OK】 [転載禁止]©2ch.net peace.2ch.net/test/read.cgi/tech/1439849418/ 次期規格C++1zはこちら C++14/C++1z 20 peace.2ch.net/test/read.cgi/tech/1410382924/ ■長いソースを貼るときはここへ。■ codepad.org/ ideone.com/
- 307 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 19:47:50.10 ID:IzwQBNZR.net]
- 物理メモリが見えないから、原理的に無限のメモリを使えるキリッ
とか書いてあるんだけどさ、、、 前々から疑問なんだけど、C/C++ってデフォで関数が動的(staticでない)なんだけど、 あれって何で?メリット無いよね? 教えてエロい人。 C#やJavaはランタイムがある前提だから、実行時に動的関数のアドレスを再利用することも出来る。(やろうと思えば) だから、確かに原理上はどんな大きなプログラムでも、一時的に使用するメモリが十分小さければ実行できる。 結果、C#やJavaには動的関数にするメリットがある。 でもC++ってないよね? あれって分割コンパイルを円滑に行うための方便? 別にstaticである必要もないんだけどさ。
- 308 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 20:02:23.73 ID:qBJEaPVd.net]
- >>302
>C/C++ってデフォで関数が動的(staticでない)なんだけど よくわからない,もう少し説明がほしい メンバ関数は「デフォ」でstatic じゃないインスタンスメソッドだがそれはC#/Javaと同じ C#/Java はクラスに属しない関数は存在しえないが,C/C++ はクラスと結びつかない関数はありえる,ということはあるね ランタイムの存在とインスタンスメソッド/クラスメソッドの有無とに何の関係も見出せないが?
- 309 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 20:02:28.82 ID:0lL32CsL.net]
- >>302
何言ってるか解らないんだけど 関数のアドレスが枯渇するプログラム?何それ?
- 310 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 20:06:20.03 ID:4SVIoSBj.net]
- 関数が動的ってどういう意味なんだろう
ぐぐったらこんなのが出てきたけど ttp://www5b.biglobe.ne.jp/~suugaku/vc++kougi/ckougi/dai8koudai3wa.html 関数それ自体が消滅するわけじゃないよね
- 311 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 20:08:30.59 ID:0lL32CsL.net]
- >>302
前々から疑問に思ってるんならそのままにせずにちゃんと調べた方がいいよ あんたの書いてる事読むと基礎を全く理解しないまま放置して自分の中でこういうものと思いこんでる物が育ってる感じしかしないよ
- 312 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 20:08:47.78 ID:QVf3KibQ.net]
- >>302
メモリ管理はOSの仕事だろう
- 313 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 20:11:04.82 ID:XzxcjOEi.net]
- 単にstaticといわれても
メンバ関数と普通の関数では意味が変わるし それを加味しても言ってる意味が良く分からないんだが それともライブラリの静的/動的リンクの話か? それなら実行ファイルのサイズ削減と実行時のメモリ節約だ 同じライブラリを複数のプロセスから動的ロードすると ライブラリのメモリ上での実態がプロセス間で共有される
- 314 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 20:16:03.88 ID:qBJEaPVd.net]
- DLLはあまり成功しているようにみえないが‥
- 315 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 20:17:39.45 ID:QVf3KibQ.net]
- >>305
仮に動的生成をしてるとしたら、 f()を直接呼ぶ場合と、 何かの関数を呼び、その中から呼んだ場合で アドレスが変わると言うこと何だろうけど、本当?
- 316 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 20:21:39.99 ID:XzxcjOEi.net]
- >>309
成功も失敗も・・・ OSのAPIはDLLにするしかないだろ そうしないとアプリにOSそのものを静的リンクしなければならなくなるだろ、ありえん DLLは絶対必要な仕組み
- 317 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 20:26:20.93 ID:XzxcjOEi.net]
- >>310
>>305のページは殆ど無茶苦茶で頭痛くなるので君のような初心者は読まないほうが良い 有る程度分かった人がニヤニヤしながら読む以外に存在価値のないページ 関数のコードが動的に生成されたりはしない スタックフレームが動的に生成されるだけ
- 318 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 20:27:30.64 ID:4SVIoSBj.net]
- >>310
ttp://www5b.biglobe.ne.jp/~suugaku/vc++kougi/ckougi/dai8koudai3wa.html 関数にstaticつけるとメモリに駐留するとか適当なこと言ってて 単に知識がないか間違って覚えてるっぽい
- 319 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 20:34:16.96 ID:0lL32CsL.net]
- >>305
>>310 リンク先読んで吹いた やべぇなこれ。思い込みでここまで書けるのもすごいが、こんなの公開して誤った知識を持つ奴が増えるのも恐ろしい。 C言語界におけるテロ行為や〜 >※ プログラミングの学習において、完全に理解してから次に進むという完全主義は、学習を妨げることになります。基本は、意図したとおりコンピュータが動けばよいです。 とかかいてるけど理解しないのと誤った理解をするのは別だよな… 去年までページ更新してるみたいだし連絡したら削除してもらえんかなぁこれ少なくともC言語に関わるところ全て
- 320 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 20:34:19.78 ID:f8ZVmSR1.net]
- >>305>>314
ワロタwww これ絶対にわざと間違えて書いてるだろうww
- 321 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 20:42:48.62 ID:az+bvJoo.net]
- なんかよくわからなくなってきたんだが、自由関数のアドレスっていつ決定されるの??
プログラムのロード時?だとすると、なぜ関数ポインタをテンプレートに渡せるの? テンプレートがインスタンス化された時に相対的なアドレスが決定されるからという理解でいいのかな??
- 322 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 20:58:13.63 ID:0lL32CsL.net]
- >>316
関数のアドレスはリンク時に決定する テンプレートに関数を渡せるのはマクロと一緒でテンプレートを実体化したコード内に関数名そのまま埋め込まれるから
- 323 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 21:25:16.23 ID:/zbs+z1X.net]
- >>313
ヤベー、コーラ吹いたわ 変数の知識から、頑張って類推で理解しようとしているのか もしくはファンクタとごっちゃになってるのか
- 324 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 21:30:27.57 ID:K/qYM/td.net]
- そこはファンタ吹いとけよ
- 325 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 21:31:25.34 ID:XzxcjOEi.net]
- その人類推するのは大好きみたいで掛け算についても色々類推して
リボン計算とやらを発見したらしんだが、 どうみても普通の筆算の書き方を変えただけなんだが www5b.biglobe.ne.jp/~suugaku/neko/dai1koudai6wa.html
- 326 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 21:37:25.15 ID:IzwQBNZR.net]
- >>305のリンクが話題になっているが、
実は俺もそのリンクにしかたどり着けず、長年の疑問を解消できていない。 そのリンク先での内容はスタックの存在を考えていないことが間違いだ。(static変数とstatic関数を混同している) 多分、C言語は仕様にスタックの存在が仮定されていると思う。 ただ、関数自体はそのように動的に生成され、消滅しても良いことに仕様としてはなっている。 (と断言できるほど明確に記述はされていないが) ただこの場合関数ポインタが使えなくなるため、通常のC/C++では実際には生成/消滅はしない。 結果的にC/C++の場合の静的関数(static void hoge()等)と動的関数(void hoge()等)に大差はない。 だからこそ、静的関数のメリットが分からない。 C++の場合、templateは静的に展開される。 つまり、必要なものを全てコンパイル時に生成し、実行体に埋め込む。 templateは使った分だけきっちりexeが膨らむ。 従って、template等を使い尽くした場合、場合によってはアドレス空間が枯渇する。 (ただし parametar pack の場合だけ別扱いかもしれないが。) en.cppreference.com/w/cpp/language/parameter_pack >>310 C++/CLIでは関数は動的に配置される。 そのクラスが使用される時にメンバ関数がメモリ上に配置され、不要になれば回収される。 従って原理的には32bitマシンでも4GB以上のexeを動作させられる。(C#も多分同じ) クラス外部から関数のアドレスを参照する場合は static である必要がある。 これは実行時に仮想関数等のアドレステーブルに配置できることを保証するため。 つまり、staticを付けるかどうかは明確に違いがある。 分かりやすくいえば、 ・4GB以上のexeを32bitマシンで実行できるか?(データではなく、命令部分だけで4GB以上) となる。C++/CLI、C#は出来る。Javaも多分出来る。 C/C++は多分できない。(動的関数ならできる)
- 327 名前:デフォルトの名無しさん [2015/09/21(月) 21:40:23.93 ID:QaJZDGlp.net]
- そのページの人はがんばって考察してるのは好感が持てる
- 328 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 21:46:12.22 ID:XzxcjOEi.net]
- >>321
>結果的にC/C++の場合の静的関数(static void hoge()等)と動的関数(void hoge()等)に大差はない。 >だからこそ、静的関数のメリットが分からない。 つまらない事を長年悩んだり、長文書き込む前に まず基本的なCの文法を学習しては? static void hoge()のメリットなんか初心者でも知ってる事 たぶんC言語の初心者用のサイトでも載ってる筈
- 329 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 21:46:34.32 ID:4SVIoSBj.net]
- >>321
関数にstaticを付けた場合その関数は内部リンケージになるってだけだぞ 一体どっから動的関数やら静的関数やらが出てくるんだ…
- 330 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2015/09/21(月) 21:53:27.69 ID:3iy+9eBG.net]
- typedef void (*FN)(void);
void *p = malloc(...); memcpy(p, ...); FN fn = (FN)p; (*fn)(); free(p); 「動的関数」ってこんな感じ?
- 331 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 21:59:22.27 ID:XzxcjOEi.net]
- はーそんな例とか
むしろ proc = GetProcAddress( の方が一般的だろうに 普段散々使っておいて 残念な人だ
- 332 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 22:09:21.94 ID:/rzmNe57.net]
- mallocの領域を実行したらメモリ保護で落ちるだろ
20年前からワープしてきたのか
- 333 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 22:09:54.13 ID:rFlrDRn6.net]
- 型を変数として扱うことってできない?
型を格納する型 Typetype だとしたら Typetype ttype1 = 引数の型をハッシュ化する関数(var); if (ttype1 == ttype2) {} みたいに
- 334 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 22:11:28.95 ID:rFlrDRn6.net]
- ただsizeofってのはなしで
- 335 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 22:12:05.09 ID:0lL32CsL.net]
- >>321
> ・4GB以上のexeを32bitマシンで実行できるか?(データではなく、命令部分だけで4GB以上) > > となる。C++/CLI、C#は出来る。Javaも多分出来る。 > C/C++は多分できない。(動的関数ならできる) そりゃあ間にVMをかましてるんだから原理的には出来るだろうけど(一時記憶にメモリを使わずファイルに書き出すとかね) まともな実効速度が出るはず無いしメリット何も無いから誰もやらないだけ。 それを出来るというには無理がある。 C/C++だって同じようにVM作れば出来る。同じようにメリット無いから誰も作らないだけ
- 336 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 22:12:17.14 ID:tvQQ1s/5.net]
- >>328
typeid
- 337 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 22:15:54.75 ID:rFlrDRn6.net]
- >>331
ありがとう こんな機能があったとは知らなかった
- 338 名前:片山博文MZ ◆T6xkBnTXz7B0 mailto:sage [2015/09/21(月) 22:17:34.32 ID:3iy+9eBG.net]
- VirtualProtectみたいな関数ってMacやLinuxでもあるの?
- 339 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 22:20:25.72 ID:0lL32CsL.net]
- >>321
大体クラスとか関数単位でプログラムをロードして実行出来たところで4GBのメモリ制限に蚊に刺されるほどしか影響しねえよ お前は実行されるコードが数GBになるプログラム作ったことあるんか?と そんなのより普通はデータを記憶するためのヒープが圧倒的に足りなくなる
- 340 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 22:21:24.48 ID:0lL32CsL.net]
- >>333
mprotect
- 341 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 22:34:48.88 ID:IzwQBNZR.net]
- >>323-324
確認した結果、確かにそのようだ。こちらの勘違いだった。 こちらは純粋C++ではなくVC++遣いなので、少し混乱していた。すまん。 >>325 手動ならそういうことになる。CLRはそれを自動的にやっている。 >>330,334 CLRはそうなっている。文句はMSに言ってくれ。 個人的には、自分で書いた部分だけで4GBを越えることは今後とも無いとしても、 C/C++の場合はDLLも含めて4GBだから、こちらは越える時があるのかもしれないとは思う。 生ポインタを渡さず抽象化している場合は、一つのarrayにつき4GBの制限になる。 だから実質的にデータ部分も含めても4GBの制限がないのと同じ。 ただ素直に64bitに移行する方がいいと思うし、実際にMSもそういう判断だと思うが。
- 342 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 22:39:34.79 ID:tvQQ1s/5.net]
- >>336
あんたの使ってるのはVC++ではなくてC++/CLIなので ttp://peace.2ch.net/test/read.cgi/tech/1268613679/ スレはこっち >>310のサイトでもC++/CLIをC++だと間違って書いていて 迷惑この上ない
- 343 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 22:49:46.15 ID:QVf3KibQ.net]
- 数GBにもなるプログラムってあるのかな
何か間違っている様な気がする。 分割して10個〜20個くらいに分割した方が良くないかな・・
- 344 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 22:53:28.63 ID:0lL32CsL.net]
- >>33
MSに文句も糞もねえよ 仕様上は出来る、同じようにC言語だって仕様上は出来る でも使える速度にならないから使えねえって言ってんの MSだってそんな事わかってるからそんな実装にしてないだろ 実質使えないものを出来るって主張して何がしたいのか?
- 345 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 23:01:45.88 ID:IzwQBNZR.net]
- >>337
> >>310のサイトでもC++/CLIをC++だと間違って書いていて なるほどそういうことか。そう思って読めば確かにそうだ。 以前おかしいと思っていた説明部分も見あたらない、、、こちらも勘違いだったのかも。すまん。 > あんたの使ってるのはVC++ではなくてC++/CLIなので 使っているのはVC++だぞ。 C++はVC++6.0までだというのならそれは認めるが。 ただ、Windows上で一番お手軽なC++風の環境はVC++なんだよ。 ただそれは実はC++/CLIであり、似て非なる言語なところが問題なんだが。 とはいえ、アンマネージで全部書けば限りなくC++に近くなるはずではあるし、 「初心者のための」なんだから、その辺はいいとは思うけど。
- 346 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 23:04:28.14 ID:tvQQ1s/5.net]
- 初心者こそC++/CLIなんて変態言語ではなく
CLRを使うのならC#を使うべきだ
- 347 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 23:11:16.76 ID:XzxcjOEi.net]
- >ただ、Windows上で一番お手軽なC++風の環境はVC++なんだよ。
>ただそれは実はC++/CLIであり、似て非なる言語なところが問題なんだが。 ほら、もう何にも分かってなくね プロジェクトを作る時にCLRにするかどうか選べる CLRにしなければ普通のC++だ どこまで勘違いでスレを混乱させたら気が済むの?
- 348 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 23:12:45.18 ID:IzwQBNZR.net]
- >>339
勘違いしているのだと思うけど、 C#は完全にCLR上で動いていて、関数は動的配置だぞ。これはいいか? 批判的なのはいいが、事実としてC#は既にそうなんだよ。 ランタイムまで自分で作る気ならCでもできるとも言えるが、それは普通は出来ないと言うよ。 C#の場合はそこまで含めて勝手にやってくれる。 つまり、ポインタのサイズを意識する必要がない。 Javaに至ってはポインタがないんだからポインタのサイズも糞もない。 ランタイムなんて糞遅いというのは事実なんだけど、 実際、そういう糞遅いアプリでも問題ない場合の方が大半なんだよ。
- 349 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 23:16:50.51 ID:XzxcjOEi.net]
- それってJITのためであって
32bitの壁とか関係なくね? C++はコンパイル言語なんでJITは無いから 始めから関係なくね
- 350 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 23:17:06.84 ID:tcBLogIW.net]
- >>331
意地悪な回答だな type_index教えてやらないと使いにくくてしょうがないだろ
- 351 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 23:19:54.09 ID:IzwQBNZR.net]
- >>338
DLLのロード/アンロードはOSがやるから出来るのだけど、 C/C++の場合はDLL先の生関数ポインタも仕様的には掴めるはず。 だから、実質的にはDLLのアンロードは出来ない。 (正確に言うと、アンロード後の空間に別のDLLを配置しなおすことは出来ない) よって、同様に、C/C++の場合は、DLLやフレームワークまで全て含めて4GBの制限になる。 今のところまだかからないけど、今後は分からないよ。 それとは別に、マルチプロセス/プロセス間通信で実現するというのはありだ。
- 352 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 23:26:54.98 ID:IzwQBNZR.net]
- >>342
> CLRにしなければ普通のC++だ そうだったのか。了解した。 >>344 > 32bitの壁とか関係なくね? いや、関係ある。 生ポインタを渡す限り、アドレス空間の再利用が出来ない
- 353 名前:から、
一切合切含めて4GBの制限がかかってしまうという話。 生ポインタを渡さない場合は、この制限が無くなる。 ただその制限がないとして、今の時点では特にメリットが無いというのも認める。 [] - [ここ壊れてます]
- 354 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 23:27:29.86 ID:tvQQ1s/5.net]
- CLRだろうが32bitアプリのvirtual sizeが4Gを超えることはないんじゃないか
>>346 FreeLibraryすればdllは解放されるだろ そのあとつかんだ関数ポインタの先は無効になるだろうし 解放した領域に別のdllが読み込まれても問題がない
- 355 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 23:30:33.86 ID:XzxcjOEi.net]
- >>348
これ以上引っ掻き回さんでくれ 彼が言ってるのは明示的なFreeLibraryじゃなくてOSが強制的にDLLをアンロードしてスワップする事
- 356 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 23:31:24.91 ID:IzwQBNZR.net]
- >>341
今はそう思うけど、 C既習だと、C++と付いている方が安心するんだよ。
- 357 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 23:31:52.49 ID:XzxcjOEi.net]
- あと、C#の関数が動的なのはJITの為であって
32bit空間でスワップしてやろうって意図はないはず C++にJITは無いので動的である必要もなし
- 358 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 23:32:52.24 ID:0lL32CsL.net]
- >>343
それで、そのCLIは何で実装されてるのかな?どうやって動くのかな? そこまでちゃんと考えてる? 4GBの制限はポインタサイズだけの問題だと思ってないよね?
- 359 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 23:35:35.38 ID:IzwQBNZR.net]
- >>349
> 彼が言ってるのは明示的なFreeLibraryじゃなくてOSが強制的にDLLをアンロードしてスワップする事 そういうこと。 >>348 自分で管理してFreeするのならそれは出来る。 ただこの場合は自分で掴めるアドレス全体が4GBの制限にかかる。 CLRだと仕様的にはいくらでもつかみ放題だということ。管理する必要もない。
- 360 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 23:40:33.83 ID:IzwQBNZR.net]
- >>352
どうやら君は理解できていない。 動的再配置の場合は、今まさに使っているもの以外は見えないんだよ。 だから、全体で4GBではなくて、各部品が4GBの制限になる。これは理解できているかい? すまんが空回りするようならこの話はここら辺で終わりでいい。 他の人は理解できているから。
- 361 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 23:44:22.13 ID:XzxcjOEi.net]
- 嫌、俺も理解できてないし、バカなこと言ってるなって思っているから
もっと続けていいぞ >>352の言いたい事は、CLRそのものは何ビットで動いているんだという事 CLRそのものが32bitで動いていては、どの道4GB以上は扱えないよね
- 362 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 23:47:39.61 ID:0lL32CsL.net]
- >>354
ほらまた自分の思い込みを積み重ねて… なんか相手するのがめんどくさくなったから >>355 さんに任せようかな!
- 363 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 23:49:41.24 ID:IzwQBNZR.net]
- >>351
なるほどその通りだ。 関数がGCされるのは結果的なことかもしれないね。
- 364 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 23:50:48.00 ID:0lL32CsL.net]
- まぁ最後に一つだけこれは理解出来るだろうというのを
そんなに簡単な話だったら32bit版.netフレームワークに4GBの制限なんてないよね
- 365 名前:デフォルトの名無しさん mailto:sage [2015/09/21(月) 23:57:39.16 ID:IzwQBNZR.net]
- >>355
MMUでググレ。 32bit空間でリニアに使えるのは4GBなんだけど、交代で再配置するのなら実はいくらでもいける。 ただしユーザに与えた生ポインタを変更することは出来ないため、C/C++では4GBに事実上制限される。 GC前提の場合は、この制限は見えなくなる。
- 366 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 00:04:04.39 ID:JsyQDq8z.net]
- 他人が書いたコードを読むのは
超労力がかかる オナニーコードは 超面倒な
- 367 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 00:06:58.92 ID:ThaQ2i1X.net]
- 32bit上で4GB制限を突破させる機能の名前はx86ならPAEな
それを使ってもMMUの管理する仮想アドレス空間は4GBのまま
- 368 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 00:12:11.77 ID:dkFhdmkv.net]
- CLRが勝手に関数(コード)をアンロードするわけないだろ。何考えてるんだ?
- 369 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 00:18:17.64 ID:FQwXFz67.net]
- アンロードはしないけどシリアライズしてメモリ以外に保存する実装があってもおかしくはないな
もちろん使う側からは透過的に
- 370 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 00:24:52.12 ID:ThaQ2i1X.net]
- >>363
それ実行ファイルがディスクにあるはずなのにシリアライズして保存する意味がわからねーな 直前にJITコンパイルしたバイナリを一時的にディスクに保存してから実行するとかならまぁ解るけど
- 371 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 00:26:02.37 ID:PT+IC+/U.net]
- >>363
CLRはMSILという中間言語を実行時にJITして配置するから、 結果的に各関数は使うまで配置されないし、使い終わったら捨てられるのかと。 多分オリジナルのMSILはstaticに存在するのではないかと。 ただそれがメモリ上である必要はないが。 結果的に透過的になる。 https://msdn.microsoft.com/ja-jp/library/z1zx9t92.aspx
- 372 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 00:36:49.33 ID:PT+IC+/U.net]
- >>361
そこまで知っているのなら俺が言っていることの意味は分かるはずだが。 PAEまで使えばとりあえず4GBx10までは見える。 ただ、PAEがマトモに使えるようになったのはWin8からだ。 そして、そんなことをやるより64bitに移行するのをMSは選択した。 XPにPAEという声も根強かったが、ガン無視したからね。(それで正しいと思うが)
- 373 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 00:42:01.36 ID:dkFhdmkv.net]
- >>365
コードの場合「使い終わった」を自動的に判定する方法が無いでしょ 勝手なアルゴリズムで判定されても困るので、現実にはそんな実装は使い物にならない 現実にはプログラマーが明示的に指定するしかないんだよね
- 374 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 00:53:02.41 ID:rOSfUNAw.net]
- >>367
いえ関数の実行が終わったら捨ててもいいです
- 375 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 00:57:27.51 ID:PT+IC+/U.net]
- >>367
各クラスのメンバ関数は、そのクラスのインスタンスが全て無くなれば要らなくなる。 当たり前だが、GC上のオブジェクトについては全て「型」を知っている。 だから、GCヒープしか提供していない言語であれば、全く問題なく回収可能。 それ以前に、JIT前提であればとりあえず回収して例外処理で再配置も可能。 コピーオンライトの関数版だ。 とにかく君達が懐疑的なのは分かったが、実際CLRはそうなんだよ。
- 376 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 01:00:19.19 ID:WExvsg0o.net]
- そんなゴミ実装してるわけねーだろ
常識で考えろ
- 377 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 01:03:28.46 ID:rOSfUNAw.net]
- >そのクラスのインスタンスが全て無くなれば要らなくなる
なんだその非論理的な思考は X x = new X(); x.Baka(); x = null; //よし、いらなくなった!かいほうだ!! x = new X(); x.Baka();
- 378 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 01:09:52.47 ID:RZYVlzX/.net]
- GCの実装を妄想で語るスレ?
- 379 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 01:11:24.05 ID:PT+IC+/U.net]
- >>371
X x = new X(); //ここで初めてオブジェクトのメンバ関数も配置される x.Baka(); x = null; //これ以降解放してよし。GC対象。 x = new X(); //ここで再びXがメンバ関数と共に配置される x.Baka();
- 380 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 01:15:38.85 ID:RZYVlzX/.net]
- .NETのGCも一般のGCの機構も理解してないみたいだね
全てが参照カウントだと勘違いしてる アセンブリの機構考えれば、即時開放がありえないとわかると思うけど 何でそんな実装だと思ったんだろ?
- 381 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 01:16:15.49 ID:ThaQ2i1X.net]
- >>369
どうなんだよ 実際32bit版で4GB越えれるのかよ? 仕様上はできるっていうならC言語でもできるって言ったよな?
- 382 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 01:17:40.85 ID:PT+IC+/U.net]
- てかまあもうスレチだし止めよう。
とにかくCLRはそうなんだよ。 ググッてもなかなかでてこないのだけど、(いいキーワードが思いつかない) 例えば delegate というのは関数ポインタなんだけど、これはへまをするとGCされる。 https://msdn.microsoft.com/ja-jp/library/43yky316(v=vs.110).aspx kchon.blog111.fc2.com/blog-entry-139.html https://msdn.microsoft.com/ja-jp/library/17sde2xt(v=vs.90).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-3
- 383 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 01:19:10.62 ID:PT+IC+/U.net]
- >>375
分かりやすく書いただけ。 もっと分かりやすく言えるのなら、君が371にレス付ければいい。 要するにエラーにはならないということが明確に分かればいいだけだろ。
- 384 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 01:23:12.34 ID:rOSfUNAw.net]
- そうかそうか
>>373はクラスロード時にJITコンパイルが行われると勘違いしちゃったんだな それでオブジェクトの寿命とリンクするという珍妙な発想に至ったと
- 385 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 01:24:00.21 ID:PT+IC+/U.net]
- >>375
32bit版とかいう概念がJavaやC#の仕様にないってことだよ。 そこは既に抽象化済みなんだよ。 はいもうこの件は終わり。 PAEまで使って32bitを延命させる意味はないとMSが判断した以上、.NETもそれに追従だ。 今後はどうなるかは知らない。
- 386 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 01:28:11.27 ID:ThaQ2i1X.net]
- >>375
> 32bit版とかいう概念がJavaやC#の仕様にないってことだよ。 > そこは既に抽象化済みなんだよ。 長々続けて結論それ?
- 387 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 01:28:25.18 ID:RZYVlzX/.net]
- >>376
最初のコード例、自分でGC呼んでる時点で即時開放理論が破綻してるじゃん なんで自分で理解できてないサイトをなんで出すの?
- 388 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 01:37:37.39 ID:RZYVlzX/.net]
- あー…、読み返したらプロセスアドレス空間もまともに理解せずに
MMUで拡張できるとか言ってるレベルなのねこの人
- 389 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 03:17:16.45 ID:+Z/sOppv.net]
- なんかスレ伸びてると思ったらスレ違いのことで伸びてるのか。
> そのクラスが使用される時にメンバ関数がメモリ上に配置され、不要になれば回収される。 C#なら回収されるのはアプリケーションドメイン単位 >>376 それはおそらく関数ポインタを入れてる変数がGCされている
- 390 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 03:20:50.96 ID:PT+IC+/U.net]
- >>375
ちなみに知らないのだとおもうが、PAE対応アプリもあるにはある。 SQL Server とか、他にも一つか二つくらいあったはず。逆に言えばそれくらいしかなかったと思う。 > この結果、アプリケーションは 15 GB までの物理メモリにアクセスできます。 https://msdn.microsoft.com/ja-jp/library/Cc785115(v=WS.10).aspx https://technet.microsoft.com/ja-jp/library/ms175581(v=sql.105).aspx APIはMapUserPhysicalPagesで窓アクセスになる。 https://msdn.microsoft.com/ja-jp/library/windows/desktop/aa366527(v=vs.85).aspx てかこの件について君らがムキになる意味が分からん。 ランタイムで隠蔽すれば普通に出来る。(ユーザーが全く関知する必要がない=同じソースコードで動く) ただし出来るのとやるのは別で、MSは64bit化を急ぐという判断だった。 PAEは延命で、64bit化は解決なのだから、妥当な判断だと思う。 逆にLinuxはPAE派だったと思ったが、どうなったのかは知らない。
- 391 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 03:21:26.35 ID:PT+IC+/U.net]
- 広範囲にランダムアクセスをするのでなければ、窓アクセスでもそこそこ使える。
オブジェクト指向なら見えないもの(privateやスコープ外)の方が多いのだから、 ランタイムがしこしこ貼り直してくれれば問題ない。 これを手動でやるとなると、実際には管理しきれないから、 単純なキャッシュ的使い方にするか、あるいはラッパを用意するかになる。 もちろんそれでもやりたい人はやれるようにAPIがあるわけだが。 > 大量のデータを操作するアプリケーションが、ハード ディスクの代わりにメモリにデータを維持することで、パフォーマンスが向上します。 https://msdn.microsoft.com/ja-jp/library/cc775523(v=ws.10).aspx C/C++はメモリモデルがフラットで、リニアにアクセスできる前提だ。(ポインタは常にアクセス可能) だから4GBの壁が直接見える。 C#とかはそもそもメモリモデル自体が必要ない。 変数はただの箱で、前回入れたものが出てくるだけ。共用体は禁止だ。 だから4GBの壁なんてものがそもそも存在しない。 ランタイムさえ対応すれば同じソースでPAE/AWEで15GBまでヒープ上に確保できることになる。 (C#のArrayは必ず添字チェックをしているため、ランタイム側で細切れに貼り直すことが出来、 結果、ユーザ側に15GBの一つのArrayを確保することも可能。) ただしMSはこれを目指さなかった。 特に不思議なわけでもなく、ムキになる話でもないと思うが。 GCヒープ自体が一つのオブジェクトみたいなもので、get/setしかインタフェースを提供してない。 だからこういう事が普通に出来る。 (ただし繰り返すが、出来るのとやるのは別)
- 392 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 03:33:20.14 ID:ThaQ2i1X.net]
- >>385
だから何度も言ってるように仕様はそうかもね、でも仕様の話だったらC言語でも可能だよ で実装はどちらも対応してないよね
- 393 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 03:36:37.45 ID:RZYVlzX/.net]
- そらあらゆる機能を使えば「可能」だろうが
あんた「実際」とか「たぶん」とか実装の話してただろ .NETは無闇にアンロードはしないよ
- 394 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 03:37:04.93 ID:RZYVlzX/.net]
- >>387は>>385宛てね
- 395 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 04:21:48.04 ID:RZYVlzX/.net]
- C#単体での仕様にすら注意書きに
実装では不要かどうかは将来使われるか解析してから決めるだろうとか書いてある ちょっとひどすぎませんか?
- 396 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 04:22:58.08 ID:PT+IC+/U.net]
- >>386
そうじゃなくて、Cの場合は sizeof(void*) が確定的なんだよ。 だから32bit版というものが絶対的に存在してしまう。 C#にはそれがないって話。 ただこれは379と同じなんだけどね。
- 397 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 04:24:02.48 ID:PT+IC+/U.net]
- >>384
> C#なら回収されるのはアプリケーションドメイン単位 了解した。 > それはおそらく関数ポインタを入れてる変数がGCされている その線は考えたが、、、まあ上記と合わせて冷静に考えればそのようだ。 ここの人達は関数の動的配置/回収をそもそも信じていない。 だから回収事例として用意したつもりだが確かに間違いのようだ。 動的関数生成をしないのなら、GCする必要もなく、回収がAPドメイン単位なら静的展開してそれっきりだね。 ちなみに回収タイミング/単位自体は俺は気にしておらず、動作できる例として出していたのだが、 そこに噛みつく奴がいて余計におかしな事になった。 ただまあ、APドメイン単位での回収で確定だし、助かった。 > プロセス全体を停止せずに、個々のアプリケーションを停止できます。 アプリケーション ドメインを使用すると、1 つのアプリケーション内で実行されているコードをアンロードできます。 > 個々のアセンブリや型はアンロードできません。 アンロードできるのはドメイン全体だけです。 https://msdn.microsoft.com/ja-jp/library/2bh4z9hs(v=vs.110).aspx ただこれならもうちょっとC++/CLIは緩くてもいいはずなのだが、、、 他クラスのpublicメンバ関数を呼ぶ場合もstaticじゃないとC2352エラー(下側例)になるのだが、これは何故? APドメイン単位で展開してるのなら呼ばせてくれよーと思う。(これがあるから型単位だと思っていた) https://msdn.microsoft.com/ja-jp/library/2x426hte.aspx なお回答頂けるのであれば、CLIスレで構いません。 peace.2ch.net/test/read.cgi/tech/1268613679/
- 398 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 04:25:27.88 ID:PT+IC+/U.net]
- すいません、>>391は>>383宛て
- 399 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 04:36:51.05 ID:RZYVlzX/.net]
- >>390
sizeof(void*)は確定的じゃないし そもそもメモリアドレスって物理アドレスそのまま使ってるわけじゃないよ
- 400 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 04:44:57.21 ID:RZYVlzX/.net]
- >>391
>とにかく君達が懐疑的なのは分かったが、実際CLRはそうなんだよ。 って言ったんだから自分でGC呼んじゃ駄目でしょ
- 401 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 05:53:43.52 ID:ThaQ2i1X.net]
- >>390
Cのソースコードに32bit版も何ももありませんけど? ついでにいうと事前にネイティブコードに変換しなければならないというCの仕様もありません C言語のインタプリタも可能ですし実際にあります で、何が確定的ですか?
- 402 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 06:51:30.72 ID:4+3Ce3pv.net]
- 専用ハード作って動かせばなんでもできるよ
- 403 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 06:59:57.30 ID:BmBfsQQC.net]
- >>305
> これが何故、ビルドエラーしないのでしょうか。 この一文で読む価値のないページってわかる w
- 404 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 08:40:28.48 ID:lcSEArpd.net]
- 自説に絶対の自信ニキ
vs 違う、違うよ(その他全員) の構図が大変面白い よろしい、続けたまえ スレ移動して誘導先張ってくれると なおありがたい
- 405 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 08:51:45.99 ID:QigibK2U.net]
- >>385
>C/C++はメモリモデルがフラットで、リニアにアクセスできる前提だ いえ、ISO/IEC 14882:2014はそうはなってないと思います
- 406 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 11:22:32.99 ID:LojobDxZ.net]
- やっぱりマシンがどのように動作しているか理解するには、c言語が理解できる程度の脳ミソがないと難しいのかね。
- 407 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 11:52:36.13 ID:PT+IC+/U.net]
- >>399
どれのこと?Nxxxxでよろしく。またはググるからキーワードをくれ。 www.wdic.org/w/TECH/ISO/IEC%2014882%3A2014
|

|