1
0
mirror of https://github.com/google/comprehensive-rust.git synced 2024-12-11 21:22:20 +02:00

Add speaker notes about RVO in borrowing.md

This commit is contained in:
Fabian Bornhofen 2023-01-10 15:04:17 +01:00
parent e29c3bfb99
commit d157b54fd4

View File

@ -21,3 +21,31 @@ fn main() {
* The `add` function _borrows_ two points and returns a new point. * The `add` function _borrows_ two points and returns a new point.
* The caller retains ownership of the inputs. * The caller retains ownership of the inputs.
<details>
Notes on stack returns:
* Demonstrate that the return from `add` is cheap because the compiler can eliminate the copy operation. Change the above code to print stack addresses and run it on the [Playground](https://play.rust-lang.org/). In the "DEBUG" optimization level, the addresses should change, while the stay the same when changning to the "RELEASE" setting:
```rust,editable
#[derive(Debug)]
struct Point(i32, i32);
fn add(p1: &Point, p2: &Point) -> Point {
let p = Point(p1.0 + p2.0, p1.1 + p2.1);
println!("&p.0: {:p}", &p.0);
p
}
fn main() {
let p1 = Point(3, 4);
let p2 = Point(10, 20);
let p3 = add(&p1, &p2);
println!("&p3.0: {:p}", &p3.0);
println!("{p1:?} + {p2:?} = {p3:?}");
}
```
* The Rust compiler can do return value optimization (RVO).
* In C++, copy elision has to be defined in the language specification because constructors can have side effects. In Rust, this is not an issue at all.
</details>