2016-08-07 8 views
1

「オブジェクトから継承しないとどうなりますか?恐ろしいことですが、これらのクラスは少し軽量ですが、プロパティ変更通知などの機能が不足しています。共通の基底クラスを持っています。通常、Objectから継承するのは、あなたが望むものです。 Vala team saidValaオブジェクトクラスが通常クラスよりも軽い

オブジェクトを継承しているかどうかにかかわらず、クラスがどれほど明るいかを知りたかったのです。

だから、ここに私のテストファイルです

test1.vala:

class Aaaa : Object { 
    public Aaaa() { print ("hello\n"); } 
} 
void main() { new Aaaa(); } 

test2.vala:

class Aaaa { 
    public Aaaa() { print ("hello\n"); } 
} 
void main() { new Aaaa(); } 

コンパイルはTEST1の大きさ、全く予想外であった結果の後に9.3kbであり、test2のサイズは14.9kbであり、これは彼らの言うことと矛盾しています。誰かがこれを説明できますか?

答えて

2

生成されたオブジェクトコードと実行可能ファイルのサイズを比較していますが、チュートリアルのステートメントが参照していたものではありません。

クラスがサポートする機能を参照しています。それは、あなたがGLib.Object/GObjectが提供するすべての機能を取得していないことを明確にしているだけです。

C#(およびJavaでも)では、型システムは「ルート」です。つまり、すべてのクラスは常に暗黙的にSystem.Objectから派生しています。それはValaにとっては当てはまりません。 Valaクラスは「スタンドアロン」クラスにすることができます。つまり、これらのスタンドアロンクラスには親クラスがありません(GLib.Object/GObjectもありません)。

スタンドアロンクラスはGLib.Object/GObject(glibに実装されている)の機能を再利用しないため、コンパイラはより多くのボイラープレートコードを出力する必要があります多くのボイラープレートコードを含む)。

"yourfile.c"ファイルを生成する "valac -C yourfile.vala"と自分自身を比較できます。

1

これは非常に興味深い質問です。その答えは、GObjectsの仕組みに深く関わっていきます。この種の質問ではvalacの便利な機能はスイッチ--ccodeを使用することです。これは、バイナリの代わりにCコードを生成します。 Objectを継承しない2番目のコードサンプルのCコードを見ると、aaaa_refaaaa_unrefのようなもっと多くの関数が含まれています。これらは、GLibのオブジェクトシステム内のオブジェクトを処理するために使用される基本関数です。 Objectから継承すると、これらの関数はすでに親クラスに定義されているので、Cコードとその結果のバイナリは小さくなります。ちょうどObjectからあなたがGType、独自に作成している継承せずにclassを使用しますが、あなたのクラスは軽量化されているので、その意味でObjectのすべての機能を継承しないことにより

。これにより、インスタンス化が迅速になります。同じ数のGObjectオブジェクトを継承するオブジェクトと比較して、莫大な数のGTypeオブジェクトを作成するのにかかる時間をお持ちの場合は、GTypeオブジェクトがより迅速に作成されるはずです。 GTypeオブジェクトはいくつかの追加機能を失います。したがって、選択はアプリケーションによって異なります。

関連する問題