[580] Re:ポインタ
投稿者:(ぱ)
2007/02/20 02:13:25
>これが同じ意味になるのは、pascalにコピーコンストラクタのようなものがないからですよね。もしC++だったら別の意味になってしまいます。
なるほど。それはわかります。
>ということで、「コピー渡し」「原本渡し」という言葉を考えてみました。
>従来「値渡し」と呼んでいるものは、たいていの場合スタックにコピーが作られるので「コピー渡し」であると。逆に「参照渡し」と呼んでいるものは「原本渡し」であると。
なんというか憂鬱本の「実体渡し」を彷彿とさせますが… それはさておき。
「変数引数」的なことをやりたいときに、参照渡しだと、実装上面倒なことに
なるケースがあるわけです。たとえばJavaでは、素朴なVMでは、ヒープ中の
オブジェクトの先頭以外、ポインタが継続して指すことはありませんが、
参照渡しを許すと、ローカル変数やら、オブジェクトのメンバやら、配列の
要素を指すポインタが継続して保持されてしまう。これは、ガベージコレクタの
実装を考えると何かと面倒です。
そのせいかどうかは知りませんが、Javaは変数引数という機能を言語から
捨て去ってしまった。でも、やっぱりそれじゃswap()も作れないし不便だよね、
という時に、call-by-value-resultという実装方法は効果を発揮するわけです。
Pascal的な言語だと、こうやって実装の楽なGCと変数引数が混在できますが、
コピーコンストラクタを好き勝手に書けるC++だと難しそうではあります。
C#では、=でコピーコンストラクタが動くわけではなかったですよね。確か。