Kann ein intelligenter Zeiger wegoptimiert werden?

Kann ein intelligenter Zeiger wegoptimiert werden?

Mit der Als-ob-Regel darf der Compiler jede Optimierung vornehmen, solange das beobachtbare Verhalten identisch ist.

Sofortige Freilassung q /p wäre nicht erlaubt, da Sie dann einen baumelnden Zeiger verwenden würden.

Obwohl es den Destruktor vor dem Ende des Gültigkeitsbereichs aufrufen kann:

{
    int* p = new int(0);
    std::unique_ptr<int> q(p);
    ...
    // make use of 'p'
    ...
    // No longer use of p (and q)
    ...
    // Ok, can delete p/q now (as long there are no observable behaviors changes)
    ...
}

Als operator new /delete global geändert werden könnte, würde der Compiler im Allgemeinen nicht über genügend Informationen verfügen (der Linker jedoch), also bedenken Sie, dass sie (potentiell) beobachtbares Verhalten haben (wie alle externen Funktionen).

c++14 erlaubt einige Auslassungen/Optimierungen neuer Ausdrücke, also

{
    delete new int(42);
    int* p1 = new int(0);
    int* p2 = new int(0);
    std::unique_ptr<int> q2(p2);
    std::unique_ptr<int> q1(p1);
    ...
    // make use of 'p1'/p2
    ...
}

Kann "ersetzt" werden durch

{
    // delete new int(42); // optimized out
    std::unique_ptr<int[]> qs{new int [] {0, 0}}; // only one allocation instead of 2
    int* p1 = q->get();
    int* p2 = q->get() + 1;
    ...
    // make use of 'p1'/p2
    ...
}