2015-01-19 3 views
5

Ich habe oft gehört, dass es eine schlechte Übung ist, Code in den Header zu stellen, aber es war üblich, kurze Funktionen in den Headern zu platzieren, teilweise um den Compiler zu optimieren.Kann ein moderner C/C++ - Compiler besser mit dem Code im Header optimieren?

Mithilfe der Inline-Schlüsselwörter kann der Compiler bestimmen, welche Funktionen inline ausgeführt werden sollen, aber abgesehen davon gibt es noch einen Grund für kurze, leistungskritische Funktionen in den Headern? Oder spielt es für moderne Compiler keine Rolle mehr?

+1

Wenn Sie eine Headerdatei einschließen, kopiert und fügt der Präprozessor den Code buchstäblich in den Code ein, in den Sie ihn eingefügt haben. – Andrew

+0

Ich schlage vor, Sie werfen einen Blick über hier: http://programmers.stackexchange.com/questions/180904/are-header-files-actually-good –

+1

'Inline' bedeutet meist nicht" machen diesen Code inline "in C++ Es hat mehr damit zu tun, wie man Kollisionen von Verbindungszeitnamen auflöst. "Code inline einfügen" hat im Kontext des C++ - Standards wenig Bedeutung. – Yakk

Antwort

4

Technisch bedeutet das Schlüsselwort inline nur, dass die Definition in mehreren Übersetzungseinheiten zulässig ist. Das heißt, wenn Sie eine Inline-Funktion in einer Header-Datei definiert haben und diese in mehreren Quelldateien enthalten ist, dann ist das in Ordnung. Für eine Nicht-Inline-Funktion ohne Vorlage wäre dies illegal.

Compiler können und müssen jedoch den Vorteil nutzen, dass sie den Code der Funktion sehen können, die aufgerufen wird. Dies geschieht nicht nur für Inline-Funktionen, sondern auch für alle anderen Funktionen, deren Code sichtbar sein kann. Viele Compiler versuchen zu raten, ob der Code eingebunden werden soll. Wenn der Code inline ist, kann das Programm größer oder kleiner, schneller oder langsamer werden. Wenn der Compiler feststellen kann, dass der Code wahrscheinlich schneller und kleiner ist, wenn der Code inline ist, wird er es tun. Andernfalls muss der Kompromiss berücksichtigt werden.

Viele moderne Compiler können Link-Zeit-Optimierung, wo Code, der nicht inline zu beginnen mit inline in der Link-Phase, mit einigen Kosten in Link-Zeit. Es kann bestimmte Optimierungsmöglichkeiten geben, die verloren gehen, wenn sie bis zur Verbindungszeit verzögert werden.

In meiner eigenen Erfahrung habe ich festgestellt, dass kleine Funktionen inline zu machen in der Regel immer ein Gewinn für Größe und Geschwindigkeit ist. Bei größeren Funktionen sehe ich oft, dass die Programme schneller, aber größer werden, aber ich habe auch gesehen, dass es die Programme nur selten langsamer und größer macht. Wenn die Leistung einer bestimmten Funktion wichtig ist, müssen Sie Messungen durchführen, um zu entscheiden, ob Sie inline arbeiten oder nicht.

+0

Gute Info. Der Schlüssel zu mir ist, dass "Compiler den Code der aufgerufenen Funktion sehen können und können", und dies gilt auch für die Link-Time-/Gesamt-Programm-Optimierung.Ich hatte gehofft, damit nur lesbar umgehen zu können, aber was Sie sagen, macht Sinn, und wie immer scheint es kein Ersatz für das tatsächliche Benchmarking zu geben. Vielen Dank! –

Verwandte Themen