2010-07-27 3 views

Antwort

5

Sie sollten die Quellgröße verkürzen (wenn sie wiederverwendet werden), aber nicht die Binärgröße (die Vorlage wird für jede unterschiedliche Instanziierung kompiliert).

Diese von Java Generika unterscheidet, wo es einen vollständigen Typ Löschung ist (Generika als Kompilierung Überprüfung der Typen nur dienen) oder C#, in denen Generika in spezifische Binärdateien kompiliert werden, die neu kompiliert werden direkt wiederverwendet werden können, ohne dass und erzeugen mehr Code.

0

Die binäre Größe hängt von Ihrem Compiler und den Optimierungen ab, die der Compiler durchführen wird, um die Code-Größe zu reduzieren, indem redandant-Code entfernt wird.

Moderne Compiler können redundanten Code erkennen, so dass die Binärgröße durch die Verwendung von Vorlagen nicht dramatisch zunimmt.

+0

Ich bezweifle, dass der Compiler kann mehr mit Vorlagen als mit nicht-Template-Funktionen. Vorlagen verfügen über eine externe Verknüpfung, sodass sie nicht aus der Objektdatei entfernt werden können. Jede Technik, mit der der interne Code der Vorlage reduziert werden kann, wird auch für nicht vorlagenbasierten Code verwendet. –

2

Mein Verständnis ist, dass Sie für jeden Typ mit einer Vorlage instanziiert die complier die entsprechende Klasse produziert diese Art passen - so, wenn Sie List<int> verwenden, List<foo> und List<float> wird es effektiv drei verschiedenenList Klassen in Ihrer erfüllt binär .

Edit:
Was habe ich nicht explizit Zustand war, dass ich schließen, dass in zu einer einzigen Vorlage (wahrscheinlich) werden mehrere Klassen Verschmelzung nicht die Größe Ihrer binären zu reduzieren, sollte aber die Größe reduzieren deine Quelle.

+1

Ihr Verständnis ist gut, und beachten Sie auch, dass (nur wenn Sie die Klasse manuell instanziieren) nur die Methoden, die tatsächlich verwendet werden, kompiliert werden. Ich habe das zu meiner Antwort nicht hinzugefügt, da Linker nicht verwendeten Code aus der Binärdatei entfernen können, sodass eine ähnliche Speicherplatzoptimierung für nicht vorlagenbasierten Code verfügbar ist und das keinen Unterschied macht. +1 –

0

Vorlagen werden definitiv eine Möglichkeit sein, generischer und kürzerer Code zu schreiben. Anstatt Ihre Funktion blah n mal zu schreiben, um mit verschiedenen Arten von Parametern umzugehen, schreiben Sie sie einmal mit einem generischen Typ für den Parameter.

In Bezug auf die binäre Größe wird Code für die Instanziierungen generiert, die Sie von der Vorlage vornehmen, dh wenn Sie einen Typ angeben. Ich sehe nicht, wie es binäre Größen verkürzen würde.

2

Es kommt darauf an ... Wenn Sie für jeden Typ eine separate Klasse implementieren würden, würde sich die Quellcodegröße verringern.

Am wahrscheinlichsten werden Sie keinen signifikanten Unterschied sehen, denn wenn Sie separate Klasse für jeden Typ implementieren würden und Sie nicht, weil Sie Vorlagen verwendet haben, bedeutet dies nicht, dass die binäre Größe abnimmt , weil dieser Code vom Compiler generiert wird (für die Instanziierungen), Sie dürfen also keinen signifikanten Unterschied haben, weil "code ist gleich".

Verwandte Themen