[Bug c++/57971] New: Improve copy elision when returning structs by value

scovich at gmail dot com gcc-bugzilla@gcc.gnu.org
Wed Jul 24 19:29:00 GMT 2013


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57971

            Bug ID: 57971
           Summary: Improve copy elision when returning structs by value
           Product: gcc
           Version: 4.8.1
            Status: UNCONFIRMED
          Severity: enhancement
          Priority: P3
         Component: c++
          Assignee: unassigned at gcc dot gnu.org
          Reporter: scovich at gmail dot com

Hi all,

In the testcase below, bar() and baz() perform copy elision as expected, but
blah() does not, in spite of its being functionally identical to baz():

#include <cstdio>
struct foo {
    foo() { printf("make\n"); }
    foo(foo const &) { printf("copy\n"); }
    void frob() { printf("frob\n"); }
};

foo bar(bool) {
    foo f;
    f.frob();
    return f;
}
foo baz(bool mknew) {
    if (mknew)
        return foo();
    return bar(mknew);
}
foo blah(bool mknew) {
    if (mknew)
        return foo();
    foo f = bar(mknew);
    return f;
}

int main() {
    printf("*** bar ***\n");
    bar(false);
    printf("*** baz ***\n");
    baz(false);
    printf("*** blah ***\n");
    blah(false);
}

Output is:

$ g++ -Wall bug.cpp && ./a.out
*** bar ***
make
frob
*** baz ***
make
frob
*** blah ***
make
frob
copy

I assume that bar() and baz() exploit the named and unnamed return value
optimizations, respectively, but blah() is missed because it needs both
optimizations together.



More information about the Gcc-bugs mailing list