Ich möchte genau verstehen, warum der Libc ++ - Sichtbarkeitsmakro für eine Inline-Funktion __forceinline
oder __attribute__((__always_inline__))
als Teil der Attribute verwendet, die er mit Inline-Funktionen verknüpft.
Für Hintergrund siehe:
Wenn diese Inline-Funktionen trotzdem als __visibility__("hidden")
markiert werden, warum ist es dann notwendig, den Compiler zusätzlich dazu zu zwingen, sie inline zu verknüpfen?
Ich habe ein wenig darüber nachgedacht, und ich habe ein paar Hypothesen, aber keine scheint mir völlig befriedigend:
hidden
nicht ausreichend? Ist es nicht nur notwendig, die Funktion beim Erstellen der Bibliothek inline zu erzwingen? Die Verbraucher sollten sich nicht darum kümmern. visibility("hidden")
? Ich frage das, weil ich an der Erstellung einer C ++ - Bibliothek arbeite, für die ich hoffentlich eines Tages eine ABI standardisieren werde, und ich benutze libc ++ als Leitfaden. Bisher hat es gut geklappt, aber dieses Problem hat Kopfkratzen verursacht.
Insbesondere haben wir Berichte von Nutzern erhalten, die sich darüber beschwert haben, dass MSVC sich weigerte, das Attribut __forceinline
zu berücksichtigen, was zu Warnungen führte. Unsere vorgeschlagene Lösung besteht darin, die Erweiterung unseres Analogons auf INLINE_VISIBILITY beim Erstellen der Bibliothek nur auf __forceinline
(oder das GCC-Äquivalent) zu beschränken, unter der Annahme der ersten obigen Erklärung.
Da wir jedoch nicht ganz davon überzeugt sind, dass wir die Gründe dafür verstehen, dass Inline-Funktionen in erster Linie __forceinline
oder __attribute__((__always_inline__))
sind, zögern wir etwas, diese Lösung zu übernehmen.
Kann jemand eine definitive Antwort darauf geben, warum libc ++ die Inline-Inline-Funktionen erzwingen muss, obwohl sie bereits mit versteckter Sichtbarkeit ausgestattet sind?
Ich bin wahrscheinlich in der besten Position, um das anzusprechen, da ich derjenige bin, der es getan hat. Und dir mag die Antwort vielleicht nicht. : -)
Als ich libc ++ erstellt habe, war mein einziges Ziel macOS (OS X). Dies war lange bevor libc ++ Open-Source war. Und meine Hauptmotivation für das Inline-Forcen war, die ABI der Dylib zu kontrollieren, die mit OS-Releases ausgegeben werden würde. Eine erzwungene Inline-Funktion würde niemals in einer dylib erscheinen, und ich könnte damit rechnen, dass ich ausschließlich in einem Header lebe (der ein anderes Liefersystem als OS-Releases hatte).
Ich habe nie das zusätzliche Attribut von "versteckt" als Teil dieser Entscheidung betrachtet, weil es für mich einfach eine unnötige Komplikation war. Ich wollte, dass die Funktion in einem Header lebt und nie in eine Dylib gesteckt wird, und das war es. Deine erste Kugel halte ich für richtig.
Ich bin begeistert, dass libc ++ über seinen ursprünglichen Umfang hinausgewachsen ist und ich wünsche Ihnen alles Gute für die Fortsetzung dieser Bemühungen. Ich bin glücklich, zusätzliche Informationen zu liefern, die ich Ihnen in Ihrem Ziel möglicherweise helfen kann.
Tags und Links c++ dll shared-libraries libc++ abi