2014-01-05 13 views
9

Wenn das C++ - Standardisierungskomitee Änderungen der STL untersucht, wird große Aufmerksamkeit darauf gelegt, keine ABI-brechenden Änderungen einzuführen.Welche Änderungen verursachen einen ABI-Bruch in C++?

Was sind die Ursachen ABI Brechen und was nicht vorstellen ABI in C++ zu brechen? ((Link zu den Kursen oder Dokument konzentriert sich auf das sind willkommen)

+4

Haben Sie eine Referenz für die Tatsache, die Sie im ersten Absatz angeben? Es scheint mir etwas merkwürdig. Ich verstehe nicht, warum eine Bibliothek sich mit der ABI beschäftigt. –

+0

@DavidHeffernan gibt es "[Bibliothek] ABI" und "die ABI". Die erste kann eine exponierte binäre Schnittstelle sein (z. B. eine gemeinsam genutzte C++ - Bibliothek). Die zweite bezieht sich normalerweise auf die implementierungsdefinierten Codegenerierungsdetails einer Compiler/Plattform/Version/Architektur/Flags-Kombination. Die erste hängt von der zweiten, aber Sie können eine „Bibliothek ABI, die portabel stabil ist“ haben – sehe

+0

@sehe Keiner von denen nach STL Standards in Bezug auf zu sein scheinen –

Antwort

6

Obwohl es keine gemeinsame ABI ist, der Standard-Ausschuss hat hört Bedenken über ABI Bruch Hersteller Erhöhung von einigen Anbietern berichtet. Ob die Sorgen um eine Änderung zu stoppen

Für die Standardbibliothek sind die primären Probleme, die einen möglichen ABI - Bruch verursachen, diejenigen, die das Layout einer Klasse oder einer Klassenvorlage ändern oder das Verhalten von typischerweise inlined Funktionen ändern die Zeit, die die Probleme gelöst werden können, durch eine etwas andere Formulierung oder durch Verschieben der Funktionalität ein wenig herum.

Für C++ 11 Ich erinnere mich an ABI bezogene Diskussionen über std::list<...>::size() wird konstante Zeit gemacht und eine COW-Implementierung für std::basic_string<...> verboten ist. Bei dem Listenproblem lag das Problem nicht darin, dass die meisten Implementierungen ohnehin schon eine konstante Zeitgröße hatten und die wenigen, die nicht ausreichend stark waren. Für std::basic_string<...> wurde die ABI für COW-Implementierungen gebrochen, weil der Nachteil, keine Datenrace-Garantien für verschiedene String-Objekte zu machen, einfach nicht akzeptabel war.

Für einige der Vorschläge, die vorgebracht wurden, z. B. die Idee, eine Stack-Trace für std::exception s zu verlangen, die jedermanns Ausnahme ABI brechen würde, ist der ABI-Bruch ein ziemlich mörderisches Argument. Obwohl manchmal Änderungen eingeführt werden, die ABI-Änderungen vorschreiben, muss der Fall viel stärker diskutiert werden als Änderungen, die nichts beeinflussen: Wenn der Nutzen der Änderung nicht das berichtete Potenzial des ABI eines bestimmten Anbieters übersteigt, wird dies nicht getan . In einigen umstrittenen Fällen gingen die Implementierer zurück und untersuchten, ob es eine Möglichkeit gibt, eine möglicherweise geringfügig ineffiziente Version aus Gründen der Abwärtskompatibilität zu implementieren.

Das Problem mit ABIs ist, dass es definitiv Unternehmen gibt, die sich lautstark beschweren, wenn sie ihre alten Bibliotheken nicht mit den neuen Compilern verwenden können. In einigen Fällen stellen die Hersteller Schalter zur Verfügung, um sie zu unterstützen, aber z. B. wird std::string in zu viele Bibliotheken eingebacken, die nur geändert werden würden.