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:
parent
e29c3bfb99
commit
d157b54fd4
@ -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>
|
||||||
|
Loading…
Reference in New Issue
Block a user