mirror of
https://github.com/google/comprehensive-rust.git
synced 2024-12-11 13:18:43 +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 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