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/
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
408 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 11:54:51.98 ID:PT+IC+/U.net] スレチだが、動的関数配置に関してはもうちょっと分かりやすい例があった。 > DynamicMethod クラス > コンパイル、実行、および破棄できる動的メソッドを定義し、表します。 破棄されたメソッドは、ガベージ コレクションの対象となります。 > Just-In-Time (JIT) コンパイラ によって作成された実行可能コードは、DynamicMethod オブジェクトがクリアされたときにクリアされます。 https://msdn.microsoft.com/ja-jp/library/system.reflection.emit.dynamicmethod(v=vs.110).aspx C/C++ではやってない話だから気味が悪いのだと思うが、とにかくCLRの世界はこんな感じなんだよ。 なおこれは既存のMSIL(中間言語)をコピーするようなので、生成ではなく流用になる。(evalではない)
409 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 12:49:28.58 ID:RZYVlzX/.net] >>402 それ標準実装じゃないだろ それを「とにかくCLRの世界はこんな感じ」って無茶言うなよ
410 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 13:10:51.94 ID:ThaQ2i1X.net] >>401 お前が >C/C++はメモリモデルがフラットで、リニアにアクセスできる前提だ な根拠を出さなきゃいけない立場なの あと確定的ってのも
411 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 13:33:48.83 ID:LojobDxZ.net] そういう機能を実現するために使う言語だからそういう機能の標準化がしづらいんだよ。
412 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 13:34:44.79 ID:dkFhdmkv.net] まだやってるのか… >>402 元々staticキーワードの有無によってできる関数の違いの話じゃなかったっけ? なんでプログラムが実行中に組み立てたメソッドの話になってるの? それで100レスくらい使って>>302 や>>321 で書いてた疑問や間違いについて少しは理解できた?
413 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 13:45:48.19 ID:39XjsZ/s.net] どうでもいいが、32bit版の.Netアプリって 32bit版の.NET Framework上で動くんじゃないの? というのも32bitアプリからは64bitDLLを読み込めないから だから32bit版の.Netアプリは32bit版.NET Framework上で動くと思うんだけど (その辺の事情はスレ違いだしよく知らんが) フレームワーク側、.Net側、管理側が32bitで4Gの壁があるのに、 その制限の中で4G以上のコードのスワップの運用をするの? そんな実装はありえないと思うんだが MMUの話が上がっていたが、あれはハードウェアで高速だし、 MMUは物理メモリが足りない場合にスワップする用途だが、 今足りない前提になっているのは論理アドレスの方なわけで 論点がズレてるわな
414 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 13:57:03.37 ID:PT+IC+/U.net] 俺の疑問(302)は解消したよ。 お前らの疑問はあるみたいだし、それについて説明も出来るけど、もう面倒なので止める。 誰か分かる人は回答してやってくれ。 てかお前らもうちょっと他言語も触った方がいいぞ。 Cの世界だけで閉じているから、Cを客観的に見れてないんだよ。 それとは別に、401に対する回答は募集する。
415 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 14:05:36.49 ID:RZYVlzX/.net] 虚勢ばっかりだな
416 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 14:15:49.93 ID:WwQzZTLz.net] いい加減スレ違いの話は収束して欲しい。
417 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 14:41:30.97 ID:ThaQ2i1X.net] ブーメランな捨て台詞で終わったな
418 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 16:14:28.65 ID:o5uWY3Fx.net] >>408 C++はオブジェクト以外の領域をポインターで指すこと自体出来ないんだからわかれよ int a; (&a + 1); // undefined behavior 1.7 The C++ memory model The memory available to a C++ program consists of one or more sequences of contiguous bytes "sequence"は複数形だぞ
419 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 16:31:50.22 ID:LojobDxZ.net] そもそも16bitアプリでfarやhugeでそれ以上の領域扱うなんて当たり前だったろうに。 cにもc++にもリニアなメモリ空間という縛りはない。 だいたいポインタが何者かすらその挙動でしか定義されていない。 実装次第でどうにでもなる。
420 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 16:34:20.90 ID:FVa42+rI.net] >>412 本題とはずれてくるけど、 &a + 1 は undefined じゃないよ。 *(&a + 1) にアクセスしたり &a + 2 すると undefined になる。
421 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 16:34:29.27 ID:nPjcOL1Q.net] そもそもメモリ空間やリニアうんたらまで考慮してプログラムしなきゃあかんのか。
422 名前:デフォルトの名無しさん [2015/09/22(火) 16:37:24.66 ID:4a3z373J.net] 俺が感じるのは int a;はaのアドレスの位置を直接番号で示していると思うんだ int a[10];と書くとアドレスの先頭のアドレスの番号を示していると思うんだ a=a+1と書くとaは変数ではなく番号だからエラーになるんだと思うよ
423 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 16:40:57.49 ID:BmBfsQQC.net] >>414 配列じゃないんだけど?
424 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 16:42:13.67 ID:gQIVdZQM.net] >>416 配列名を示す識別子を,配列要素を指定する[] を伴わずに単独で使用する用法は,特異点にしてC/C++にて一番醜いところ
425 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 16:51:41.05 ID:WExvsg0o.net] いちいち&a[0]と書けと? &a[0]のほうが醜いと思うが
426 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 16:59:16.98 ID:PT+IC+/U.net] >>412 > contiguous bytes 他の言語ではこの必要すらない。 これがリニアって事だよ。 ちなみに君はC以外の言語一つでも使えるかい? だったらその言語でこの必要があるかを考えてみるといい。
427 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 16:59:35.71 ID:FVa42+rI.net] >>417 配列じゃないオブジェクトへのポインタ演算のルールは要素数 1 の配列といっしょ。 5.7 [expr.add] p4 > For the purposes of these operators, a pointer to a nonarray object > behaves the same a
428 名前:s a pointer to the first element of an array of length > one with the type of the object as its element type. [] [ここ壊れてます]
429 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 17:07:12.07 ID:gQIVdZQM.net] >>419 構造体・クラスの場合は,単独の識別子でアドレスを示すことはないだろう? それと同じことだ
430 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 17:16:16.72 ID:WExvsg0o.net] 構造体と配列は大きさが違うだろう
431 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 17:30:38.04 ID:RZYVlzX/.net] >>420 それ実装じゃなくて抽象機械相手のもので x86の論理アドレスや物理アドレスなどとポインタと同一なんて規定は書いてない JITにしてでコンパクションしてアドレス変更されようがCは関係ない お前本当都合が良いと思った事しか答えないな いい加減どこが決定的な問題なのか説明しなよ それとずっと逃げてないで sizeof(void*)が確定的という事についても説明してね