Ich bin verwirrt. Wie ist es möglich, dass die Implementierung weiß, ob der Typ nur zur Laufzeit atomar ist?Warum ist nicht std :: atomic_is_lock_free ein statischer consExpr?
Antwort
Der Compiler kann möglicherweise nicht wissen, auf welcher CPU der Code ausgeführt wird, und CPUs können sich in ihren sperrfreien Funktionen unterscheiden. Zum Beispiel unterstützt eine CPU möglicherweise keine atomaren Operationen auf long
Typen (und daher kann eine Sperre erforderlich sein), aber wenn das System nur einen einzelnen Kern hat, können sie automatisch atomar sein, weil sie nicht unterbrochen werden können und es keinen anderen Kern gibt Rennen mit (und so nichts Besonderes ist erforderlich und der Typ ist frei von Sperren).
Wenn der Compiler nicht wissen würde, ob die CPU eine Sperre benötigt oder nicht, wie könnte er garantieren, dass der generierte Code datenrasenfrei ist? – ComicSansMS
@ComicSansMS Zur Laufzeit wird entschieden, ob Sperrcode oder Sperrcode verwendet werden soll. Ich habe Code geschrieben, der das immer gemacht hat, damals, als Single-Core-Systeme die Norm waren. –
Ich kann sehen, warum man das im Benutzercode machen möchte, aber ich wäre ziemlich überrascht, wenn ein Compiler Code wie diesen generiert hätte. Aber ich kann sehen, wie es in bestimmten Fällen eine gültige Optimierung wäre, wenn der Compiler in der Lage ist, Code zu erzeugen, um den Nur-Ein-Prozessor-Fall zuverlässig zu erkennen. Kennen Sie Compiler, die das tatsächlich tun? – ComicSansMS
- 1. consExpr Std :: optional mögliche Implementierung
- 2. Ist ein vorbestrafter Konstruktor/Auftrag von noexcept oder consExpr gestört?
- 3. Warum ist das `std` Modul nicht deklariert?
- 4. Warum ist std :: hash nicht spezialisiert für std :: reference_wrapper?
- 5. Warum ist std :: bitset :: size nicht-statisch
- 6. Warum ist std :: equal_to nützlich?
- 7. consExpr versus Vorlage, Pow-Funktion
- 8. C++ Ist ein std :: string ein Container?
- 9. consExpr Array zurückgeben, GCC-Warnung
- 10. Eindeutige Adresse für consExpr-Variable
- 11. Statischer Variablenzeiger?
- 12. Segue ist nicht von statischer UITableView Arbeits
- 13. Statischer Analysator sagt, ich habe ein Leck .... warum?
- 14. std :: condition_variable warum benötigt es ein std :: mutex
- 15. Warum ist std :: pair schneller als std :: tuple
- 16. Warum gibt numpy std() matlab std() ein anderes Ergebnis?
- 17. Warum ist std :: array < T, 0 > nicht leer?
- 18. consExpr - Funktion kann nicht in einem konstanten Ausdruck verwendet werden
- 19. Sind nicht-terminierende consExpr-Funktionen klar definiert?
- 20. Warum ist std :: chrono :: system_clock :: to_time_t() nicht consxpr?
- 21. Warum ist std :: mutex schneller als std :: atomic?
- 22. std :: enable_if ein Argument ist eine Funktion?
- 23. Ich bin ein statischer fobic
- 24. Statischer Schein funktioniert nicht
- 25. illegal Aufruf von nicht-statischer Member-Funktion
- 26. Sperrobjekt kann in statischer Klasse nicht gesperrt werden - warum?
- 27. Wie ist std :: function für ein Lambda
- 28. Ändern von Endvariablen durch Reflexion, warum Unterschied zwischen statischer und nicht-statischer Endvariable
- 29. Warum ist std :: less eine Klassenvorlage?
- 30. Warum ist der Rückgabetyp von std :: reverse_iterator :: operator [] nicht angegeben?
Beachten Sie die Kommentare zu [cppreference.com] (http://en.cppreference.com/w/cpp/atomic/atomic_is_lock_free) über ausgerichtete und falsch ausgerichtete Objekte. – Angew
Es gibt auch Makros wie 'ATOMIC_INT_LOCK_FREE' für grundlegende Typen, die Sie zur Kompilierzeit überprüfen können. – interjay
@Angew ja, aber ich fragte speziell nach 'std :: atomic_is_lock_free()' anstelle von 'std :: atomic :: is_lock_free()' (Member-Funktion). 'std :: atomic_is_lock_free' kennt nur den Typ. Wenn der Typ eine schlechte Ausrichtung hat, ist er zur Laufzeit bekannt. – GreenScape