I recently discovered std::optional as a way to improve the clarity of my code, especially for return value of functions. However I had questions about its impact on performance. More specifically I wanted to know if it was possible to write a code similar to the one below that would allow the compiler to apply Named Return Value Optimization.
struct Data
{
int x;
int y;
};
std::optional<Data> makeData(bool condition)
{
Data data;
if(condition)
{
data.x = 2.0;
data.y = 2.0;
return data;
}
else
{
return {};
}
}
Well, in this case, the as-if rule is enough already:
Datais trivially copyable and trivially destructible, so you cannot observe whether the compiler copies it, or whether it directly constructs it into thestd::optional<Data>return object. NRVO is not needed in order to prevent the copy.Let's suppose you gave
Dataa copy constructor with a side effect. Then the question of whether NRVO applies would be relevant. The answer is no: NRVO doesn't apply, because the local variable's type differs from the function return type. In order to allow NRVO to happen, you might write something like this: