Testing Return Value Optimization (RVO)

chmike via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Sun Sep 27 06:55:00 PDT 2015


Hello,

Sorry if this question is a bit naive or shows a misunderstanding 
of RVO.
I was trying to see if my C compiler was doing RVO with struct, 
but after testing it at is apparently not the case.

Since I have heard that D supports RVO I wanted to give it a try 
in D. But apparently it doesn't do RVO as I expected it would do 
it.

Here is the D code. It is very similar to the C code I tested 
with gcc and clang :
---
#!/usr/bin/rdmd -O

import std.stdio;

struct S { int a, b; };

S foo(S* p) {
     S v = {1, 2};
     writeln("foo: return value optimization: ", p == &v);
     return v;
}

void main()
{
     S x;
     x = foo(&x);
}
---

My assumption is the following. x is the target variable where to 
store the result of foo. I expected that with RVO foo() would 
receive the address where to store its result as hidden argument.

Inside foo(), the optimizer would detect that v, its returned 
value, will be stored at the location given as hidden argument. 
It may then optimize out v so that foo() uses x as storage for v.

My code is testing if this is the case and it is apparently not.

Can someone please explain me why this doesn't work as I would 
expect RVO to work ?



More information about the Digitalmars-d-learn mailing list