public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
From: "federico at kircheis dot it" <gcc-bugzilla@gcc.gnu.org>
To: gcc-bugs@gcc.gnu.org
Subject: [Bug c++/112335] missed optimization on reset and assign unique_ptr
Date: Fri, 03 Nov 2023 08:06:37 +0000	[thread overview]
Message-ID: <bug-112335-4-OJ0qoFjS1g@http.gcc.gnu.org/bugzilla/> (raw)
In-Reply-To: <bug-112335-4@http.gcc.gnu.org/bugzilla/>

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=112335

--- Comment #7 from Federico Kircheis <federico at kircheis dot it> ---
Thank you Jonathan, I've then misunderstood the example of Andrew, I thought he
was trying to create a scenario where after reset the pointer is not nullptr.

> Demo: https://godbolt.org/z/PWd96j4fz

Thank you for the example, but honestly, I think I am still missing something.

If you modify the main this way

----
int main()
{
    global = nullptr;
    std::unique_ptr<s> local1(new s);
    bar1(global, local1);
    global = nullptr;
    std::unique_ptr<s> local2(new s);
    bar1(global, local2);
}
----


or this way


----
int main()
{
    global = nullptr;
    std::unique_ptr<s> local1(new s);
    bar2(global, local1);
    global = nullptr;
    std::unique_ptr<s> local2(new s);
    bar2(global, local2);
}
----

the output is the same.
First time it prints 0, the second time a non-0 address.

> But a much simpler example where the difference is observable is when the two arguments to bar1 and bar2 are the same object:
> https://godbolt.org/z/z8fsTan8K

And this is absolutely correct, did not think of it.

> I'm not sure what you mean here. The postcondition holds unless the deleter *also* destroys the unique_ptr itself.

As written, I was not sure if this plays a role; this is what the standard says
(and I#ve misunderstood the example of Andrew).
A similar effect can be observed in the following example

----
#include <memory>

using s = int; // for simplicity

void bar1(std::unique_ptr<s>& ps1, std::unique_ptr<s>& ps2){
    ps1.reset();
    ps1 = std::move(ps2);
}
void bar2(std::unique_ptr<s>& ps1, std::unique_ptr<s>& ps2){
    ps1 = std::move(ps2);
}

void bar3(std::unique_ptr<s>& ps1, std::unique_ptr<s>& ps2){
    ps1.reset();
    ps1.reset();
    ps1 = std::move(ps2);
}
----

While you are right that bar1 and bar2 have different behavior if they point to
the same object, bar1 and bar3 are fundamentally the same function, even in
case of aliasing.
Unless the post-condition of reset is not hold; otherwise the second
"ps1.reset()" could be completely removed, as ps1 is nullptr.

  parent reply	other threads:[~2023-11-03  8:06 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-01 13:26 [Bug c++/112335] New: " federico at kircheis dot it
2023-11-01 15:51 ` [Bug c++/112335] " pinskia at gcc dot gnu.org
2023-11-02  7:17 ` federico at kircheis dot it
2023-11-02  7:19 ` federico at kircheis dot it
2023-11-02  7:30 ` pinskia at gcc dot gnu.org
2023-11-02  8:01 ` federico at kircheis dot it
2023-11-02 17:23 ` redi at gcc dot gnu.org
2023-11-03  8:06 ` federico at kircheis dot it [this message]
2023-11-03  9:10 ` redi at gcc dot gnu.org
2023-11-03 10:23 ` federico at kircheis dot it
2023-11-03 14:23 ` redi at gcc dot gnu.org

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=bug-112335-4-OJ0qoFjS1g@http.gcc.gnu.org/bugzilla/ \
    --to=gcc-bugzilla@gcc.gnu.org \
    --cc=gcc-bugs@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).