渋川です。
>「型情報を手作業で付けることができる」というだけでしょ?
>Cのランタイムにはそういう機能はありません.
>
>
型情報を常に収集する必要はないですからね。
「型情報の収集すらパフォーマンスには邪魔」だから
です。ユーザアプリを書くのにも使われるし、デバイス
ドライバを書くのにも使われる言語ですからね。
必要な時だけ手付けというのではだめなんでしょうか?
>念のため補足しておきますが,Javaのような言語では滅多に上記のようなことは
>やりません.普通はスコープから外れた時点で何もせずとも参照は消えます.
>null参照を明示的に代入するのはごく一部の例外的な場合のみです.特に
>パフォーマンスのことを考えるならば,「明示的な代入は避けろ」とまで
>言われています.(基本的に不要な処理であるため.)
>
>
コーディングスタイルは言語ごとによって違うと思いますし、僕もそこまで精通
しているわけではないので、あまり突っ込んだ議論は遠慮したいところです
が・・・・null代入を避けるというのは知りませんでした。
C/C++もスタック上のオブジェクトであればスコープが外れたら削除されます。
newしてヒープメモリ上にできたオブジェクトでもshared_ptrに格納すれば
deleteを記述する必要はありません。
明示的にdeleteできる言語のメリットというのもあると思います。明示的に
deleteできるということはオブジェクト終了のタイミングをプログラマが制御で
きるので、コンストラクタでリソースを確保して、デストラクタでリソースを解
放というリソース管理とオブジェクトの寿命を対応させることができます。リ
ファレンスカウント式のGCであればある程度解放のタイミングは読めますけど
ね。GCが標準装備(OFFできない)の言語だとデストラクタ持っていないのもあり
ますからね。
>特にマルチスレッドや並列処理ではインスタンスの生死を判断するのが格段に難しいです
>からね.これをプログラマーに書かせるとなると負担が大きすぎます.Cにはマルチスレッド
>機構がないから助かってるようなもので,マルチスレッド機能を持つJavaのような言語では
>かなり厳しくなります.
>
CもISOの規格にはスレッドはありませんが、大抵のOSでサポートされています。
というか、マルチスレッドのカーネルとかスレッドライブラリの実装自体に使わ
れる言語なので、ISOとかでスレッドが決まっていたら頭こんがらがりそうで
す。C++だけではレジスタ待避とかはできないので、一部アセンブラが必要にな
りますけどね。マルチスレッドでは寿命が問題になるような開発はしたことがな
いので(ロックが問題になるようなのはやったことがありますけど)、この件に関
してはなんにも言えません。
JavaのC++に対するメリットって「リッチな中間層」で提供されているものです
よね。中間層を増やして柔軟性と機能を追加していくのがソフトウェアの基本的
性質なら、C++はパフォーマンスのためにあえてその辺りを全部とっぱらった言
語と言えます。中間層はあとから追加できますからね。そのかわり言語機能とし
て規定されたものは引くことはできません。短時間で処理が終わるようなプログ
ラムで、かつマルチタスクOSでメモリ空間が保護されているのならば、あえてメ
モリを解放しないでプロセスの終了にまかせる、というトレードオフすらCやC++
ではありえます。そんなコーディング作法は教科書には載ることはないでしょう
けど。exact GCだって、newしたオブジェクトを全部shared_ptrに格納すればで
きるんですから。タイプ数はちょっと多くなりますけど。
なので、村山さんが「C++は自動ではやってくれない、Javaは自動でそうなる」
と言えばその通りです。僕はそれに対して「C++では後から追加できる」としか
言えません。そういう言語ですもん。そういうのが好きか嫌いかは別にして。
しぶかわよしき<yoshiki@....jp>