2012-09-28 4 views

Antwort

19

Ja, gibt es, obwohl es sehr spezifisch ist und normalerweise kein Grund zur Sorge.

Die Option -rdynamic weist den Linker an, den Symboltabellen Symbole hinzuzufügen, die zur Laufzeit normalerweise nicht benötigt werden. Dies bedeutet, dass es mehr, möglicherweise viele weitere Symbole gibt, die der dynamische Linker zur Laufzeit zur Symbolauflösung durchstreichen muss.

Insbesondere, da Symboltabellen-Lookups in GNU-basierten Systemen mit einem Hash implementiert werden, erhöht die Verwendung von mehr Symbolen die Wahrscheinlichkeit, dass es Hash-Kollisionen geben würde. Da alle Symols, die in der Hash-Tabelle kollidieren, in einer Liste sitzen, muss der Runtime-Linker die Liste durchqueren und unter Verwendung von memcmp jeden Symbolnamen vergleichen. Wenn mehr Symbole in der Hash-Bedeutung kollidieren, was längere Listen bedeutet, wird es mehr Zeit benötigen, jedes dynamische Symbol aufzulösen.

Diese Situation ist etwas schlechter für C++ und C, mit der Vielzahl von Namen mit dem gleichen Präfix aufgrund von Klassennamen.

In der Praxis wirkt sich dies nur auf das allererste Mal aus, dass ein Symbol verwendet wird. Wenn Ihre Anwendung nicht sehr groß ist und viele Symbole enthält, wird dies nicht wahrgenommen.

In dem seltenen Fall, dass Ihre Anwendung so groß ist, können Tricks wie prelinking verwendet werden, um den Overhead zu überwinden.

Verwandte Themen