Google

2011年10月25日火曜日

refで渡す引数が見当たらず

横道にそれますが、気になっていた点をひとつ。

今更ですがUnity公式リファレンスのリンクはここです。

http://unity3d.com/support/documentation/ScriptReference/

で、使用可能なクラスや構造体等の一覧は1つ下がってここ。

http://unity3d.com/support/documentation/ScriptReference/20_class_hierarchy.html

これらを見て気になっていたこととは、

「引数が全て実体渡しになっている、、、、」

です。

もともとC#には実体型と参照型があるため、生成時にそれらの違いが出ます。
組み込み型的なint等は当然実体ですが、構造体やクラスは参照です。

これが問題となるのは関数への引渡しの時。
型の振る舞いが決まるのは生成時だけとは限りません。
C/C++屋なら常識ですが、馬鹿でかいオブジェクトを単純に渡せば、関数の中で新たにメモリが生成され、生成時の負荷でも無駄コストになってしまい、場合によっては思った通りの動作になりません。
C++等の詳細仕様を見れば型そのものの概念と、引数になる際の振る舞いは厳密に分けられており、その動きは明確です。

C#では関数の引数として扱う際は基本実体渡しです。
アドレスのみを渡すならrefを、戻すならoutを付随させなければなりません。
これも言語仕様として決められているようです。
フォーラムでたまにそのへんの質問が出ているのを見ますが、回答者すらよくわかってないのか、クラスは生成時に参照なんだから決まってるだろ的なリプライがあったりして本当に困るところ。

しかしUnityのリファレンスには参照が有りません、、、。
例えば以下のコード。

Vector3 vec = transform.localScale;
print(Vector3.Scale(vec, new Vector3(2, 2, 2)));

自分のスケールを取り出して2倍にしてそれを表示という内容です。
このScaleはクラスメソッドで、以下がそのリファレンス。

http://unity3d.com/support/documentation/ScriptReference/Vector3.Scale.html

やっぱりrefはどこにもない、、、。
実際、上の2行目のvecをref vecとかするとエラーが出ます。
じゃあUnityはそんなに無駄な事をしてるのかというと、全てがそうかはまだ疑問。

勝手にref扱いしてるものがないかどうかは現在検証中。

0 件のコメント:

コメントを投稿