---
# System prepended metadata

title: How to write a function to match RVO
tags: [C++]

---


# How to write a function to match RVO

 
See the Following code.
1. `get1`
    * ```
      Output:
      100
      ----
      0
      ```
    * We only call one constructor in this function.
2. `get2`
    * ```
      Output:
      100
      ----
      default
      move
      ```
    * Call one constructor in A{100}, but call default + move constructor with `named variable`.

3. `get3`
    * ```
      Output:
      default
      ----
      default
      ```
    * Only call one constructor
#### Conclution
1. minimize your return branch. (Like `get3()`)
2. If you have multiple return branch, make the return object be constructor(unnamed) as many as posible. (Like `get1()`)
3. Although you need to do the thing like `get2`, it's ok because it's a move constructor.

```cpp=
#include <iostream>

struct A {
    int m;
    A() { std::cout << "default\n"; }
    A(int i) : m{i} { std::cout << i << "\n"; }
    A(const A&) { std::cout << "copy\n"; };
    A(A&&) { std::cout << "move\n"; };
};

A get1(int argc) {
    if (argc > -1) {
        return A{100};
    }
    return A{0};
}
A get2(int argc) {
    if (argc > -1) {
        return A{100};
    }
    A a;
    return a;
}
A get3(int argc) {
    A a;
    if (argc > -1) {
        a.m=100;
    }
    a.m=0;
    return a;
}

int main(int argc, char** argv) {
    auto a = get1(argc);
    std::cout << "----\n";
    auto b = get1(argc - 100);
    std::cout << "-------\n";
    auto c = get2(argc);
    std::cout << "----\n";
    auto d = get2(argc - 100);
    std::cout << "-------\n";
    auto e= get3(argc);
    std::cout << "----\n";
    auto f = get3(argc - 100);
    std::cout << "----\n";
    return 0;
}

```