Posso restituire in modo efficiente un object in base al valore in Rust?

Vorrei inizializzare un object grande con una funzione. Attualmente ho:

fn initialize(mydata: &mut Vec<Vec>) { /* ... */ } 

Preferirei avere:

 fn initialize() -> Vec<Vec> { /* ... */ } 

Ho sentito dire che C ++ implementa spesso l’ottimizzazione del valore di ritorno (RVO), se sei fortunato e hai un buon compilatore. Possiamo disabilitare la copia qui e averla restituita da un puntatore nascosto che viene passato alla funzione? RVO fa parte della lingua o un’ottimizzazione opzionale?

Sì, con tutti i mezzi, dovresti scrivere

 fn initialize() -> Vec> { ... } 

(A proposito, un Vec non è così grande – è solo 3 interi in formato puntatore)

Rust ha RVO, e questo è pubblicizzato nelle guide . Puoi vederlo da solo con questo codice:

 #[inline(never)] fn initialize() -> Vec { Vec::new() } fn main() { let v = initialize(); } 

Se si compila questo programma in modalità di rilascio nel parco giochi , in uscita dall’assemblaggio, tra tutto il resto vedrai questo:

 playground::initialize: movq $4, (%rdi) xorps %xmm0, %xmm0 movups %xmm0, 8(%rdi) retq 

Vec::new() era in linea, ma è ansible vedere l’idea: l’indirizzo per la nuova istanza di Vec viene passato alla funzione in %rdi e la funzione memorizza i campi Vec direttamente in questa memoria, evitando inutili copie attraverso lo stack. Ecco come si chiama:

 playground::main: subq $24, %rsp movq %rsp, %rdi callq playground::initialize 

Potete vedere che alla fine l’istanza Vec sarà messa direttamente nella memoria dello stack.