Warum wendet libcxx __forceinline oder den GCC gleichwertig zu seinen bereits versteckten Inline-Funktionen an?

8

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:

  • Es soll sichergestellt werden, dass das Symbol nicht versehentlich Teil des ABI wird. Wenn der Compiler während des Erstellens der Bibliothek die Funktion nicht inline einfügt, könnte sie möglicherweise ein externes Symbol und damit Teil des ABI werden. Aber wäre das Attribut 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.
  • Es soll sichergestellt werden, dass die Funktion niemals eine Definition hat, um ODR-Probleme zu vermeiden, wobei der Compiler die Funktion in der Bibliothek selbst nicht inline einfügt und nicht in die Funktion im Code, der von einem Client generiert wird die Bibliothek, was zu zwei verschiedenen Definitionen führt. Aber ist das nicht ein erwartetes (und akzeptiertes) Ergebnis der Verwendung von visibility("hidden") ?
  • Es ist etwas Spezifisches für das Design von libc ++ als eine Implementierung der Standardbibliothek.

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?

    
acm 02.11.2016, 21:19
quelle

1 Antwort

4

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.

    
Howard Hinnant 03.11.2016, 00:58
quelle

Tags und Links