2016-08-07 14 views
1

"Was passiert, wenn Sie nicht von Object erben? Nichts Schreckliches. Diese Klassen werden etwas leichter sein, jedoch fehlen ihnen einige Eigenschaften wie Benachrichtigungen über Eigenschaftenänderungen und Ihre Objekte haben gewonnen 't haben eine gemeinsame Basisklasse. Gewöhnlich ist das Erben von Object das, was Sie wollen. " Vala team said.Vala Objektklasse Leichter als normale Klasse

Also wollte ich wissen, wie leicht die Klassen sind mit oder ohne Objekt Objekt erben. So

, hier sind meine Testdateien

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(); } 

Die Ergebnisse nach der Zusammenstellung war völlig unerwartet, die Größe der test1 ist 9,3 kb und die Größe von test2 ist 14,9 kb und das widerspricht dem, was sie sagten. Kann das bitte jemand erklären?

Antwort

2

Sie vergleichen den produzierten Objektcode/ausführbare Dateigröße, aber das ist nicht, worauf sich die Anweisung aus dem Lernprogramm bezog.

Es bezieht sich auf die Funktionen, die Ihre Klasse unterstützt. Es wird nur klargestellt, dass Sie nicht alle Funktionen erhalten, die GLib.Object/GObject bietet.

In C# (und auch in Java?) Ist das Typsystem "rooted", was bedeutet, dass alle Klassen immer implizit von System.Object abgeleitet werden. Das ist bei Vala nicht der Fall. Vala-Klassen können "stand alone" -Klassen sein, was bedeutet, dass diese eigenständigen Klassen keine Elternklasse haben (nicht einmal GLib.Object/GObject).

Die Codegröße ist größer, weil die Stand-alone-Klasse von GLib.Object/GObject keine Funktionalität nicht wiederverwendet werden (die in glib implementiert ist), so dass der Compiler hat mehr Kesselblech Code zur Ausgabe (Klassen in C zu schreiben ist immer mit viel Kesselplatte Code).

Sie können sich mit "valac -C yourfile.vala" vergleichen, die eine "yourfile.c" Datei erzeugt.

1

Das ist eine sehr interessante Frage. Die Antwort wird Sie tief in GObjects einarbeiten. Bei diesen Fragen ist ein nützliches Merkmal von valac die Verwendung des Schalters --ccode. Dies erzeugt den C-Code anstelle der Binärdatei. Wenn Sie sich den C-Code des zweiten Codebeispiels ansehen, das nicht von Object erbt, enthält es viel mehr Funktionen, z. B. aaaa_ref und aaaa_unref. Dies sind grundlegende Funktionen, mit denen Objekte in GLibs Objektsystem behandelt werden. Wenn Sie von Object erben, sind diese Funktionen bereits in der übergeordneten Klasse definiert, sodass der C-Code und die resultierende Binärdatei kleiner sind.

Mit nur class verwenden, ohne von Object vererben Sie Ihre eigenen GType, schaffen aber nicht alle Funktionen von Object so in diesem Sinne erben Ihre Klassen sind leichter. Dadurch können sie schneller instanziiert werden. Wenn Sie Zeit wie lange dauert, um eine große Anzahl von GType Objekte im Vergleich zu der gleichen Anzahl von GObject Objekte zu erben, sollten Sie das GType Objekt schneller erstellt werden. Wie Sie gezeigt haben GType Objekte verlieren einige zusätzliche Funktionen. Die Auswahl hängt also von Ihrer Anwendung ab.