wie kann swap noexcept sein?



  • Wie kann swap noexcept sein, wenn doch die Erstellung eines temporären Objektes zu einer bad_alloc exception führen kann? (Oder kann es das nicht, oder sieht die impl. von swap anders aus als ich denke?)



  • Indem swap eben keine temporaere Kopie erstellt.

    Wenn du zB 2 std::vector swappen willst, kannst du einfach die internen Zeiger tauschen.



  • und wenn 4 byte für einen Zeiger schon zu viel sind, oder geht das sowieso in irgendein register?
    EDIT: Vielleicht ist der Stack auch schon rimmel rammel voll.

    EDIT 2: Halt, führt ein Stackoverflow nicht immer zum terminate?
    Dann wärs das ja schon mit der Frage 😃



  • Tim06TR schrieb:

    EDIT 2: Halt, führt ein Stackoverflow nicht immer zum terminate?
    Dann wärs das ja schon mit der Frage 😃

    Stackoverflow = UB.
    Im Prinzip kannst du ein statisches Array von 1MB anlegen und als Zwischenspeicher benutzen und bist damit immer noch noexcept.



  • @Tim06TR
    Die Sache ist im Prinzip recht einfach.

    Der Standard schreibt nicht vor wie viel Stack es geben muss, verlangt aber trotzdem dass du keinen Stackoverflow produzierst. Und zieht sich mit UB aus der Affäre wenn du es doch machst.

    D.h. sämtliche Garantien die der Standard abliefert gelten nur wenn du brav bist und kein UB produzierst.
    Dadurch kann der Standard auch leicht noexcept für bestimmte Funktionen garantieren.
    Weil die Garantie einfach nicht gilt, wenn es auf Grund eines Stackoverflows Probleme gibt.

    In der Praxis gilt die Garantie aber. Jedes moderne Desktop-/Server-OS wird dir nen Mechanismus anbieten das Programm kontrolliert abzubrechen wenn ein Thread nen Stackoverflow baut. Aus C++ Sicht endet an dieser Stelle die Welt. D.h. die noexcept Garantie wurde auch nicht verletzt.
    Und wenn man möchte dass das Programm nicht an dieser Stelle abbricht, dann dreht man einfach die Stacksize rauf und lässt es nochmal laufen. Wobei ich dieses Problem unter Windows noch nie hatte -- die Default 1MB sind anscheinend für so-gut-wie jedes Programm ausreichend.


Anmelden zum Antworten