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.
next prev 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: linkBe 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).