2016-07-29 38 views
2

Ich habe schon eine ganze Weile mit C++ programmiert und es macht mir viel Spaß, Vorlagen zu benutzen. Was ich in letzter Zeit aufgrund meines Vorstoßes in Embedded-Programmierung gefragt habe, ist, wie man erwarten sollte, dass sich der Linker in Bezug auf Code-Duplizierung in Template-Instanzen verhält, in denen der Template-Parameter anders ist.Optimiert der Linker normalerweise doppelten Code von verschiedenen C++ - Vorlageninstanzen?

Für mehrere Instanzen derselben Vorlage mit denselben Parametern dies gut bekannt ist, während Link Zeit optimiert werden entfernt (siehe auch: How does C++ link template instances)

aber in meinem Fall bin ich interessiert, wenn der Linker jede dupliziert erkennen Code zwischen zwei Vorlagen, die mit verschiedenen Parametern instanziiert wurden. Da es sich um verschiedene Typen handelt, würde ich davon ausgehen, dass sie nicht automatisch zusammenbrechen würden. Da sie jedoch einige Funktionen haben könnten, die nicht von den Template-Parametern abhängen und somit zwischen den beiden Klassen identisch wären, könnte man annehmen, dass ein Linker diese Funktionen optimieren und somit Platz sparen könnte.

Was wäre das erwartete Verhalten in diesem Fall?

+0

Haben Sie godbolt versucht? – lorro

+0

Ja siehe zum Beispiel: https://godbolt.org/g/jbx2ms, aber das ist nur der Compiler, soweit ich es sagen kann und nicht der Linker. Dort unten gibt es den gleichen Code, den der Linker optimieren könnte, aber ich weiß nicht, ob es das normalerweise tun würde. – Blackclaws

Antwort

5

Gold-Linker tut genau das.

Safe ICF: Pointer Safe and Unwinding Aware Identical Code Folding in Gold:

Wir haben festgestellt, dass große C++ Anwendungen und gemeinsam genutzte Bibliotheken sind in der Regel viele Funktionen haben, dessen Code mit einer anderen Funktion identisch. Bis zu 10% des Codes könnten theoretisch eliminiert werden, indem solche identischen Funktionen zu einer einzigen Kopie zusammengeführt werden. Diese Optimierung, Identical Code Folding (ICF), wurde im Gold-Linker implementiert. Zur Verbindungszeit erkennt ICF Funktionen mit identischem Objektcode und führt sie zu einer einzigen Kopie zusammen.

+0

Sieht gut aus. Es scheint auch, gcc hat eine Option, die das während des Linkens tut https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html, aber sie sagen, dass einige Dinge nur durch Gold geholt werden, während einige Dinge nur durchgeholt werden gcc – Blackclaws

+0

@Blackclaws Ich habe Gold Linker seit 2011 verwendet und ich mag, dass es ein paar Mal schneller als die alte 'ld' verbindet und auch eine nette Funktion' -detect-odr-Verletzungen' hat. –