Jump to content

Talk:Return value optimization

Page contents not supported in other languages.
From Wikipedia, the free encyclopedia

// copy result into hidden object
*_hiddenAddress = result;

[edit]

Wouldn't this be an assignment and not a copy? Thus, calling an assignment operator once and a copy later -- without the optimization. — Preceding unsigned comment added by Zerooneinfinity (talkcontribs) 06:24, 23 November 2011 (UTC)[reply]

Actually, it is an assignment of the address of the temporary local variable to the supplied pointer. ;-) I suspect, the code must be:
void f(Data * _hiddenAddress) {
  Data result = {};
  // generate result
  memcpy(_hiddenAddress, &result, sizeof(Data)); // copy result into hidden object
  return;
}
int main() {
  Data d;
  Data _hidden; // create hidden object
  f(&_hidden);
  memcpy(&d, &_hidden, sizeof(Data)); // copy the result into d
}
Mikhail Ryazanov (talk) 08:29, 22 May 2013 (UTC)[reply]

Another difference between copy and direct initialization

[edit]

Apart from requiring the existence of a copy constructor, copy initialization also requires an implicit constructor of the correct type. Direct initialization however allows the compiler either to use an explicit constructor of the correct type, or implicitly convert the provided argument into an intermediate type. --80.175.250.222 (talk) 00:08, 18 January 2010 (UTC)[reply]

Move/Split of this article with one called "Copy Elision"

[edit]

I think this article needs to be split apart. The segment on "Other forms of copy elision" has absolutely nothing to do with Return Value Optimization, other than the fact that both are forms of copy elision. I'm going to do the split in one week if nobody says otherwise. —Preceding unsigned comment added by Billyoneal (talkcontribs) 05:34, 11 April 2010 (UTC)[reply]

Hi Billy, good suggestion. I just went ahead and did the fork. decltype (talk) 21:08, 17 April 2010 (UTC)[reply]
Thank you Decltype :) Billyoneal (talk) 05:28, 19 April 2010 (UTC)[reply]
Why not merge both articles into a new or existing "Temporary object" article? Both of these are more misleading than anything. --184.21.215.174 (talk) 15:44, 6 September 2012 (UTC)[reply]

Mention move constructors in C++11?

[edit]

It may be meaningful to mention move constructors in C++11, as they fix the problem noted in the last section, where the compiler may be unable to perform the optimization. — Preceding unsigned comment added by 68.173.69.69 (talk) 21:56, 2 March 2012 (UTC)[reply]

Compiler support: "There may be [...] circumstances where the compiler is unable to perform the optimization" is wrong IMO

[edit]

Example shown will indeed certainly copy the string.

However, how could it be different? If this wasn't a function (i.e. same code copy/pasted directly in the main), two intermediate objects would have been created anyway, and a copy will happen anyway... (except if there are deeper/other compiler optimization).

So IMHO the example is wrong, because it's misleading.

It should be something like this (for the f part):

std::string f(bool cond = false) {
  return cond ? std::string first("first") : std::string second("second");
}

In this case, the RVO optimization is more likely to be applied.

The examples assumes "deeper" optimization. The article should probably just focus on the fact that temporary objects are hypothetical creatures. And having side effects in copy constructors intended to be used to instantiate temporary objects is a bad idea. Optimization is another article. --184.21.215.174 (talk) 15:42, 6 September 2012 (UTC)[reply]

Merge

[edit]

I suggest this article should be merged with the Copy elision article, they both talk about the same thing. Return value optimization could be a section of the Copy elision article. --Living001 (talk) 07:36, 12 July 2013 (UTC)[reply]