- C++相談室 part119 [転載禁止]©2ch.net
302 :デフォルトの名無しさん[sage]:2015/09/21(月) 19:47:50.10 ID:IzwQBNZR - 物理メモリが見えないから、原理的に無限のメモリを使えるキリッ
とか書いてあるんだけどさ、、、 前々から疑問なんだけど、C/C++ってデフォで関数が動的(staticでない)なんだけど、 あれって何で?メリット無いよね? 教えてエロい人。 C#やJavaはランタイムがある前提だから、実行時に動的関数のアドレスを再利用することも出来る。(やろうと思えば) だから、確かに原理上はどんな大きなプログラムでも、一時的に使用するメモリが十分小さければ実行できる。 結果、C#やJavaには動的関数にするメリットがある。 でもC++ってないよね? あれって分割コンパイルを円滑に行うための方便? 別にstaticである必要もないんだけどさ。
|
- C++相談室 part119 [転載禁止]©2ch.net
321 :デフォルトの名無しさん[sage]:2015/09/21(月) 21:37:25.15 ID:IzwQBNZR - >>305のリンクが話題になっているが、
実は俺もそのリンクにしかたどり着けず、長年の疑問を解消できていない。 そのリンク先での内容はスタックの存在を考えていないことが間違いだ。(static変数とstatic関数を混同している) 多分、C言語は仕様にスタックの存在が仮定されていると思う。 ただ、関数自体はそのように動的に生成され、消滅しても良いことに仕様としてはなっている。 (と断言できるほど明確に記述はされていないが) ただこの場合関数ポインタが使えなくなるため、通常のC/C++では実際には生成/消滅はしない。 結果的にC/C++の場合の静的関数(static void hoge()等)と動的関数(void hoge()等)に大差はない。 だからこそ、静的関数のメリットが分からない。 C++の場合、templateは静的に展開される。 つまり、必要なものを全てコンパイル時に生成し、実行体に埋め込む。 templateは使った分だけきっちりexeが膨らむ。 従って、template等を使い尽くした場合、場合によってはアドレス空間が枯渇する。 (ただし parametar pack の場合だけ別扱いかもしれないが。) http://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++は多分できない。(動的関数ならできる)
|
- C++相談室 part119 [転載禁止]©2ch.net
336 :デフォルトの名無しさん[sage]:2015/09/21(月) 22:34:48.88 ID:IzwQBNZR - >>323-324
確認した結果、確かにそのようだ。こちらの勘違いだった。 こちらは純粋C++ではなくVC++遣いなので、少し混乱していた。すまん。 >>325 手動ならそういうことになる。CLRはそれを自動的にやっている。 >>330,334 CLRはそうなっている。文句はMSに言ってくれ。 個人的には、自分で書いた部分だけで4GBを越えることは今後とも無いとしても、 C/C++の場合はDLLも含めて4GBだから、こちらは越える時があるのかもしれないとは思う。 生ポインタを渡さず抽象化している場合は、一つのarrayにつき4GBの制限になる。 だから実質的にデータ部分も含めても4GBの制限がないのと同じ。 ただ素直に64bitに移行する方がいいと思うし、実際にMSもそういう判断だと思うが。
|
- C++相談室 part119 [転載禁止]©2ch.net
340 :デフォルトの名無しさん[sage]:2015/09/21(月) 23:01:45.88 ID:IzwQBNZR - >>337
> >>310のサイトでもC++/CLIをC++だと間違って書いていて なるほどそういうことか。そう思って読めば確かにそうだ。 以前おかしいと思っていた説明部分も見あたらない、、、こちらも勘違いだったのかも。すまん。 > あんたの使ってるのはVC++ではなくてC++/CLIなので 使っているのはVC++だぞ。 C++はVC++6.0までだというのならそれは認めるが。 ただ、Windows上で一番お手軽なC++風の環境はVC++なんだよ。 ただそれは実はC++/CLIであり、似て非なる言語なところが問題なんだが。 とはいえ、アンマネージで全部書けば限りなくC++に近くなるはずではあるし、 「初心者のための」なんだから、その辺はいいとは思うけど。
|
- C++相談室 part119 [転載禁止]©2ch.net
343 :デフォルトの名無しさん[sage]:2015/09/21(月) 23:12:45.18 ID:IzwQBNZR - >>339
勘違いしているのだと思うけど、 C#は完全にCLR上で動いていて、関数は動的配置だぞ。これはいいか? 批判的なのはいいが、事実としてC#は既にそうなんだよ。 ランタイムまで自分で作る気ならCでもできるとも言えるが、それは普通は出来ないと言うよ。 C#の場合はそこまで含めて勝手にやってくれる。 つまり、ポインタのサイズを意識する必要がない。 Javaに至ってはポインタがないんだからポインタのサイズも糞もない。 ランタイムなんて糞遅いというのは事実なんだけど、 実際、そういう糞遅いアプリでも問題ない場合の方が大半なんだよ。
|
- C++相談室 part119 [転載禁止]©2ch.net
346 :デフォルトの名無しさん[sage]:2015/09/21(月) 23:19:54.09 ID:IzwQBNZR - >>338
DLLのロード/アンロードはOSがやるから出来るのだけど、 C/C++の場合はDLL先の生関数ポインタも仕様的には掴めるはず。 だから、実質的にはDLLのアンロードは出来ない。 (正確に言うと、アンロード後の空間に別のDLLを配置しなおすことは出来ない) よって、同様に、C/C++の場合は、DLLやフレームワークまで全て含めて4GBの制限になる。 今のところまだかからないけど、今後は分からないよ。 それとは別に、マルチプロセス/プロセス間通信で実現するというのはありだ。
|
- C++相談室 part119 [転載禁止]©2ch.net
347 :デフォルトの名無しさん[sage]:2015/09/21(月) 23:26:54.98 ID:IzwQBNZR - >>342
> CLRにしなければ普通のC++だ そうだったのか。了解した。 >>344 > 32bitの壁とか関係なくね? いや、関係ある。 生ポインタを渡す限り、アドレス空間の再利用が出来ないから、 一切合切含めて4GBの制限がかかってしまうという話。 生ポインタを渡さない場合は、この制限が無くなる。 ただその制限がないとして、今の時点では特にメリットが無いというのも認める。
|
- C++相談室 part119 [転載禁止]©2ch.net
350 :デフォルトの名無しさん[sage]:2015/09/21(月) 23:31:24.91 ID:IzwQBNZR - >>341
今はそう思うけど、 C既習だと、C++と付いている方が安心するんだよ。
|
- C++相談室 part119 [転載禁止]©2ch.net
353 :デフォルトの名無しさん[sage]:2015/09/21(月) 23:35:35.38 ID:IzwQBNZR - >>349
> 彼が言ってるのは明示的なFreeLibraryじゃなくてOSが強制的にDLLをアンロードしてスワップする事 そういうこと。 >>348 自分で管理してFreeするのならそれは出来る。 ただこの場合は自分で掴めるアドレス全体が4GBの制限にかかる。 CLRだと仕様的にはいくらでもつかみ放題だということ。管理する必要もない。
|
- C++相談室 part119 [転載禁止]©2ch.net
354 :デフォルトの名無しさん[sage]:2015/09/21(月) 23:40:33.83 ID:IzwQBNZR - >>352
どうやら君は理解できていない。 動的再配置の場合は、今まさに使っているもの以外は見えないんだよ。 だから、全体で4GBではなくて、各部品が4GBの制限になる。これは理解できているかい? すまんが空回りするようならこの話はここら辺で終わりでいい。 他の人は理解できているから。
|
- C++相談室 part119 [転載禁止]©2ch.net
357 :デフォルトの名無しさん[sage]:2015/09/21(月) 23:49:41.24 ID:IzwQBNZR - >>351
なるほどその通りだ。 関数がGCされるのは結果的なことかもしれないね。
|
- C++相談室 part119 [転載禁止]©2ch.net
359 :デフォルトの名無しさん[sage]:2015/09/21(月) 23:57:39.16 ID:IzwQBNZR - >>355
MMUでググレ。 32bit空間でリニアに使えるのは4GBなんだけど、交代で再配置するのなら実はいくらでもいける。 ただしユーザに与えた生ポインタを変更することは出来ないため、C/C++では4GBに事実上制限される。 GC前提の場合は、この制限は見えなくなる。
|