One of my goals this year is to learn new things that take more than a few weeks to learn. I've been learning Rust. One of the claims I saw is that Rust's borrow mechanics allow it to optimize better than C++ does. I wanted to see this in action so I ran some simple examples through godbolt. Here's some C++ code that reads from array A
and writes to array B
:
int test(const int* A, int* B, int i) { int x = A[i]; B[i] = x+1; int y = A[i]; return x+y; }
This C++ code compiles to assembly, with -O2:
movsx rdx, edx lea rcx, [rdi+rdx*4] mov eax, DWORD PTR [rcx] lea edi, [rax+1] mov DWORD PTR [rsi+rdx*4], edi add eax, DWORD PTR [rcx] ret
Note that it is loading DWORD PTR [rcx]
twice and loading DWORD PTR [rsi+…]
once. That means it's accessing A[i]
's memory twice and B[i]
once. It knows that A
hasn't changed and it knows i
hasn't changed but it doesn't know that A[i]
hasn't changed. It's possible that A
and B
overlap. That means it has to load A[i]
twice, even though it's marked const
.
Here's the Rust version:
pub fn test(A: &[i32], B: &mut [i32], i: usize) -> i32 { let x = A[i]; B[i] = x+1; let y = A[i]; return x+y; }
and the output (some parts omitted):
push rax mov eax, DWORD PTR [rdi + 4*r8] … lea ecx, [rax + 1] mov DWORD PTR [rdx + 4*r8], ecx add eax, eax pop rcx ret
This code has only two DWORD PTR
accesses. It knows that A
is a shared reference (so there are no other writers), and B
is a mutable reference (so there are no other readers). That means it can conclude that A
and B
can't overlap. Once it's read A[i]
from memory it doesn't have to read it again. Cool!
C (but not C++) has the restrict
keyword for this. You can tell the C compiler "trust me, these don't overlap", but C doesn't check. Rust checks this at compile time.
So far I'm enjoying learning Rust. It has many of the things I wanted in a language since the mid-1990s. I don't know if I'll actually use it for a real project, but that's not my goal right now. My goal is to learn some new things that challenge my brain, and Rust is doing that for me.
No hay comentarios:
Publicar un comentario