2014-01-20 13 views
7

Unter der Annahme, dass die Implementierung nicht privat gehalten werden muss, besteht ein Nachteil darin, Inline-Funktionen in Header-Dateien bereitzustellen?Sollen Inline-Funktionen in Shared-Library-Headern verwendet werden?

Ich habe verschiedene Dinge um diese Zeilen lesen, haben aber keine klare Antwort gesehen. Was sind die Vor- und Nachteile von Inline-Funktionen in installierten Headern für meine Bibliothek? Gibt es etwas, worüber ich nachdenken sollte, wenn ich mich dazu entscheide?

+0

Wer macht das Inlining? Wenn es nur deine Bibliothek ist, lege sie in eine private, aber immer enthaltene Kopfzeile. Wenn es sich um den Client handelt, müssen * sie in einem öffentlichen Header sein, oder der Compiler des Clients kann sie nicht verknüpfen. – ssube

+0

Sie können auch diese Frage Programmierer Stack in Cross-Posting interessieren: http://programmers.stackexchange.com/ – AndyG

+0

@peachykeen, na ja, sagen wir die Inline-Funktionen in den CPP-Dateien der Bibliothek verwendet werden, möglicherweise aber auch in anderen installierten Headern aus derselben Bibliothek. Clients möchten möglicherweise die Inline-Funktionen in ihrem eigenen Code verwenden. – crobar

Antwort

3

Es gibt ein Potenzial für Leistungsverbesserungen, aber Sie verlieren viele der Vorteile der dynamischen Verknüpfung. Normalerweise können vorhandene Binärdateien so gestaltet werden, dass sie (ABI-kompatible) Änderungen, Fehlerbehebungen und Verbesserungen nur durch Aktualisieren der gemeinsamen Objektdatei erhalten. Wenn ein Teil des Bibliothekscodes in die Binärdatei eingefügt wurde, befinden Sie sich im selben Boot wie die statische Verknüpfung: Sie müssen alle ausführbaren Dateien neu kompilieren, um sie zu aktualisieren.

Um fair zu sein, dies wirkt sich nur auf Änderungen an Code in inline Funktionen. Die Erfahrung zeigt jedoch, dass es einige Überschneidungen zwischen Code gibt, der von Zeit zu Zeit aktualisiert werden muss, und Code, der davon profitiert, inline zu sein.

+0

Ist das ein Nachteil von Inline-Funktionen im Allgemeinen oder nur in installierten Header-Dateien? – crobar

+0

@crobar Wie kann die Funktion eingebunden werden, wenn sie nicht in einer Header-Datei enthalten ist? Oder gibt es eine feine Unterscheidung zwischen "installierten Header-Dateien" und anderen Headern? – delnan

+0

Nun, ich muss nicht jeden Header installieren, der Teil meines Programms ist, nur diejenigen, die von Benutzern der Bibliothek benötigt werden. – crobar

4

Es wird ein Problem sein, wenn Sie binäre Kompatibilität zwischen den Versionen der Bibliothek pflegen wollen. Überlegen Sie, was passiert, wenn Sie Layout/Mitglieder Ihrer dynamischen Bibliothek ändern. Ihre Benutzer haben einige Methoden in ihren Anwendungen (für das alte Layout). Wenn Ihre App Ihre Bibliothek lädt (neue Version mit anderem Layout), werden diese alten Methoden aufgerufen und können zu ungültigen Speicherabfragen/Absturz führen.

Btw, bei Libs, ist es am besten PIMPL für alle userfacing Klassen zu verwenden.

+0

Ich dachte darüber nach, diesen Winkel selbst zu erwähnen, aber ich denke nicht, dass dieses Problem nur beim Inlining auftritt. Dieses Problem wird von dem Layout verursacht, das dem Client-Code ausgesetzt wird, ob der Code, der von dem Layout abhängt, sich in einer Inline-Funktion in dem Header befindet oder wenn es von dem Consumer der Bibliothek geschrieben wird. – delnan

Verwandte Themen