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/
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*)が確定的という事についても説明してね
432 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 17:33:33.60 ID:gQIVdZQM.net] >>423 大きさ?なんの話だ? struct a { int n1; int n2; int n3; } int b[3]; どちらも同じ集合体だが a と b で意味するものが違うのは不整合だろう?
433 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 17:38:23.04 ID:RZYVlzX/.net] つか言語仕様にunsafeとfixed持ってる時点で同類なのにアホなのかなこの人
434 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 17:40:24.63 ID:RZYVlzX/.net] >>426 は>>425 宛てじゃないからね
435 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 18:22:00.45 ID:WwQzZTLz.net] >>425 それ、違くない? struct {int n1; init n2; int n3;} a; int b[3]; printf("%p",a); printf("%p",b); エラーにはならない。
436 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 18:26:29.93 ID:WwQzZTLz.net] >>428 ごめん、a,bの前に&がいる。
437 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 18:53:37.56 ID:BmBfsQQC.net] >>421 なるほど、勉強になったわ
438 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 18:59:44.87 ID:PT+IC+/U.net] >>424 別に逃げているわけではなくて、 今の君の知識範囲では理解できないだろうから諦めたんだよ。 もう既に十分説明している。 俺の疑問は既に解消したのだから、君の突っかかりにいちいち答える必要もない。 君は知っているつもりなんだろうけど、全然分かってない。 元々のブログ(>>295 )、以下のくだりは真なんだが、そもそもこれを理解できてないだろ。 > たとえば、32bitのCPU上では、通常のプログラムは、4GBのメモリ空間に制限され、4GB以上のメモリを利用することは非常な困難を伴います。 > ところが、JavaやC#といった言語は、原理上、そのような制限を受けません(バンク切り替えだとか、セグメントだとかの話はあえて無視)。 > あくまでも原理上の話ではあるので、現状がそうなっているわけではないのですが、ポインタといった概念が言語上に出現しないことによって、 > データをメモリ上の番地で表現する必要がないためです。 俺はこの部分の説明をしていただけなんだよ。ただ、君が理解できていないとなると、その前の部分 > C/C++のプログラマの住んでいる世界は、ポインタがあるおかげで、ある意味では、何でも出来るアセンブラの世界ではあるのですが、 > そのことが逆にC/C++プログラマの発想を狭い範囲に閉じこめてしまっていることが多々あります。 > JavaやC#のようなポインタのない世界が実は、 > アセンブラのようなポインタというかアドレスに支配されている世界では想像しにくい新たなパラダイムや手法を与えてくれることもあります。 も真なのかな、とも思えてくる。(個人的にはこの部分はハズレだと思っていた。) 君が無知なままでいるのは君の責任だ。 誰かが君のことを可哀想と思うのなら、いつか教えてくれるかもしれない。 俺はここに認めてもらいに来たわけではなくて、疑問を解消しに来ている。だから用は済んだ。 君が俺のことを誤解するのも君の自由だ。それを修正する必要もない。 ただなあ、とりあえず最初のブログの中身も理解出来ないのにその態度は、痛いよ。 そういうのは止めた方がいい。 傍観している連中の中にも明らかに分かっている奴もいるはずだが、誰も出てこないのはそういうことだよ。
439 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 19:11:33.18 ID:FVa42+rI.net] >>431 >> ところが、JavaやC#といった言語は、原理上、そのような制限を受けません(バンク切り替えだとか、セグメントだとかの話はあえて無視)。 >> あくまでも原理上の話ではあるので、現状がそうなっているわけではないのですが、ポインタといった概念が言語上に出現しないことによって、 >> データをメモリ上の番地で表現する必要がないためです。 これがポインタの存在によって C や C++ に限っては成り立たないと言われているようだけど、 そんなことはないと思うんだ。 言語上の「ポインタ」を Java や C# の参照と同じように実装することは禁止されちゃいないわけで。 そこらへんわかってて言ってるの?
440 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 19:20:45.42 ID:ThaQ2i1X.net] >>432 こいつは何言っても解らないよ 可哀想なやつだと思うけど俺は諦めた
441 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 19:23:21.47 ID:39XjsZ/s.net] 毛の壁風の人なんじゃね?
442 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 19:24:45.07 ID:PT+IC+/U.net] >>432 生ポインタを使えないC言語なんて存在価値がないだろ。 実際それがあったとして、使う奴がいるとも思えないが、 ネイティブコードを吐くJavaが欲しい時に使うのか?
443 名前:432 mailto:sage [2015/09/22(火) 19:26:32.23 ID:FVa42+rI.net] >>433 そうだね >399 からそう言われてるわけで、説得できるとはあんまり思ってない。 堂々と「以下のくだりは真」というのにツッコミ無しっていうのはマズいだろうと思った。
444 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 19:27:26.06 ID:ThaQ2i1X.net] ほらなw Emscriptenとかも知らないんだろう
445 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 19:33:20.20 ID:FVa42+rI.net] >>435 存在価値の話は関係無いと思うんだ。引用箇所は >>> あくまでも原理上の話ではあるので、現状がそうなっているわけではないのですが という話だからね。 C や C++ でも同じことでしょ、と言っている。
446 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 19:34:46.81 ID:PT+IC+/U.net] >>432 ちなみに禁止されていないのは確かだが、C言語では実現出来ないだろ。 C++で演算子のオーバーロードを基本型にも全部やってラップすれば達成可能な気もするが、 ポインタのところに若干制限があった気がする。(ただこの辺は余り詳しくない)
447 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 19:36:47.03 ID:ThaQ2i1X.net] >>439 Emscriptenでググれ 生ポインタの扱えないC言語(に限らないけど)だぞ
448 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 19:42:18.38 ID:PT+IC+/U.net] >>437 いやちょっと待て。実はEmscriptenは使用を検討しようとしていた。 理由は生JavaScriptが色々糞だからで、TypeScriptも検討中だ。 それはEmscripten用の書き方だということか? ならば確かにその記述方法は妥当だろう。 LLVMからの変換だと思っていたが、それ以前にLLVMに生ポインタコードが出ないようにラップするわけだな。
449 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 19:44:12.61 ID:FVa42+rI.net] >>439 >385 で言ってた↓の根拠は不明で「ポインタのところに若干制限があった気がする。(ただこの辺は余り詳しくない)」ということでいいかな? > C/C++はメモリモデルがフラットで、リニアにアクセスできる前提だ。(ポインタは常にアクセス可能) > だから4GBの壁が直接見える。 なんかはっきりした根拠を思い出したら教えて欲しい。
450 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 19:58:38.83 ID:39XjsZ/s.net] いやもう、彼の頭をデバッグするのバカらしいし、やめようよ
451 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 19:58:39.53 ID:PT+IC+/U.net] >>438 それは繰り返しにしかならないが、以下の通り。 原理的な話なら、抽象化された変数領域しか持たない言語(C#,Java)では、アドレスというものがそもそも見えない。 だから、4GBの壁がそもそもユーザーに見えない。 これに対して、C/C++では4GBの壁がユーザーに丸見えだ。 >>432 のように、ポインタをユーザーがラップして全てint**とかにした場合、それは「ユーザーがそう記述した」という。---(A) そうではなくて、ユーザーが通常通り int* のまま使っていて、 それをコンパイラだけで int* のネイティブにするのか、int** のJava的参照ポインタにするのかをコンパイルオプションで切り換えられるのなら、 ---(B) それは「コンパイラで4GBの壁を越えた」という。 いずれにしても、C/C++言語自体で4GBの壁を越えたというのは言い過ぎだ。 ところで、Emscriptenは(B)のどちらなのか、知っていたら教えてくれ。 (ユーザ側で int** と意識して書く必要があるのか、 もしかしてユーザーは int* のままで書いてもEmscriptenが int** に完全に変換できるのか)
452 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 19:59:56.93 ID:39XjsZ/s.net] この感じ、知っている人は知っている、毛の壁臭
453 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 20:06:26.45 ID:PT+IC+/U.net] >>442 違う。 > ポインタのところに若干制限があった気がする。 演算子のオーバーライドは俺は使ってないので詳しくないのだが、 最近読み直した「プログラミング言語C++」には11.2.3に(第3版ならP317) > 特に、ポインタだけを操作する演算子関数は定義できないことに注意して頂きたい。 とあって、この件について本の中で別に説明されていたのだが、今見ても該当部分がすぐには出てこないということ。 たしかC言語との互換性を保つために、ポインタ演算子については自由に上書きできない部分があったはず。 > C/C++はメモリモデルがフラットで、リニアにアクセスできる前提だ。(ポインタは常にアクセス可能) > だから4GBの壁が直接見える。 根拠も何も、そのまんまだ。 逆に聞いてみよう。 君はC#が使えるみたいだが、C#のマネージドコードだけの世界で、4GBの壁を意識することはあったかい? 無いだろ。そういうことだよ。
454 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 20:14:07.69 ID:FVa42+rI.net] >>444 > これに対して、C/C++では4GBの壁がユーザーに丸見えだ。 これも「気がする」かな。断言するなら根拠をはっきり示せることを確認してね。 > いずれにしても、C/C++言語自体で4GBの壁を越えたというのは言い過ぎだ。 だれもそんなことは言ってないと思うんだ。 「C/C++では4GBの壁がユーザーに丸見えだ」などという人が一人いるので、それは 言い過ぎだと言っている。 >>446 「演算子が上書きできない」→「4GBの壁」っていうつながりがあると思ってるのか。 ループ気味になってきたし、ここまでの書き込みをちゃんと読んで理解しようとしてくれていれば この流れでそんなこと言えるわけが無いと思うんで、僕もそろそろ降りさせてもらうよ。
455 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 20:21:17.81 ID:PT+IC+/U.net] >>447 > これも「気がする」かな。断言するなら根拠をはっきり示せることを確認してね。 いや見えてるだろ明らかに。 void*が32bit環境では4GBまでしか表せない。だから4GBの壁が見える。 C#やJavaにはこれがない。それだけの話だよ。 > 「演算子が上書きできない」→「4GBの壁」っていうつながりがあると思ってるのか。 あるだろ。というか言い出したのはそちらだが。 4GBの壁は変数領域が抽象化されていないから見える。 だから、int**にして抽象化すれば直接は見えなくなる。 これがC#やJavaで4GBの壁が見えない理由そのものだ。ブログ主もこの観点で言っている。 まあいいよ。完全にループだし、君の論法もループしている。 降りで了解だ。こちらもその方が助かる。 それはそうとEmscriptenの情報があればよろしく。
456 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 20:30:45.91 ID:39XjsZ/s.net] 何かっこつけてんだよ、初心者の癖に
457 名前:デフォルトの名無しさん mailto:sage [2015/09/22(火) 21:15:01.03 ID:ozShReaP.net] クサカベは知ってるけど 毛の何とかは知らないなあ