Warum benötigen GCC Atomic Builtins eine zusätzliche "generische" Version?

8

Laut https://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html gibt es:

type __atomic_load_n (type *ptr, int memorder)

und (das "generische"):

void __atomic_load (type *ptr, type *ret, int memorder)

dann

void __atomic_store_n (type *ptr, type val, int memorder)

und ("das Generikum")

void __atomic_store (type *ptr, type *val, int memorder)

usw.

Was ist generisch an den letzteren Versionen (das ist nicht generisch an den ersteren) und warum werden sie benötigt?

PSkocik
quelle

Antworten:

4

Die Antwort ist richtig im GCC-Handbuch in Abschnitt 6.55 , in dem es heißt:

Die '__atomic'-Buildins können mit jedem integralen Skalar- oder Zeigertyp verwendet werden, der 1, 2, 4 oder 8 Byte lang ist. 16-Byte-Integraltypen sind auch zulässig, wenn '__int128' (siehe __int128) von der Architektur unterstützt wird.

Die vier nicht-arithmetischen Funktionen (Laden, Speichern, Austauschen und Vergleichen) haben ebenfalls eine generische Version. Diese generische Version funktioniert mit jedem Datentyp. Es verwendet die integrierte Funktion sperrenfrei, wenn die spezifische Datentypgröße dies ermöglicht. Andernfalls muss ein externer Anruf zur Laufzeit aufgelöst werden. Dieser externe Aufruf hat dasselbe Format, wobei ein 'size_t'-Parameter als erster Parameter eingefügt wurde, der die Größe des Objekts angibt, auf das verwiesen wird. Alle Objekte müssen gleich groß sein.

John Szakmeister
quelle
Es scheint mir immer noch so, als ob es nicht nötig sein sollte, zwei Versionen dafür zu haben. Sicher, mit Funktionen wäre es ratsam, große Objekte als Referenz zu nehmen, aber dies sind eingebaute Compiler. Ein Compiler sollte in der Lage sein, Zeiger bei Bedarf intern zu verwenden, ohne Benutzer mit zwei APIs belästigen zu müssen.
PSkocik
1
@PSkocik Achselzucken Ich bin mir sicher, dass es einen Grund dafür gibt, warum sie sich dafür entschieden haben, dies nicht zu tun (Compilerteams haben im Allgemeinen eine Richtlinie, warum sie einen Mechanismus einem anderen vorziehen ). Wenn Sie wirklich neugierig sind, empfehle ich Ihnen, sich an die gcc-Community zu wenden (über deren gcc-Liste - siehe Seite Mailinglisten ). Es ist schon eine Weile her, dass ich mit der gcc-Community interagiert habe, aber ich fand sie in der Vergangenheit angenehm und hilfreich.
John Szakmeister