Move in particular is painful in C++ because to make it work C++ needs to invent these "hollowed out" objects that would be safe to deallocate after there's no longer a real value inside them. Rust doesn't need to do that.
Suppose you've got a local String variable A. You will move A into a data structure which is going to live much longer and then your local function exits.
In C++ when the function exits, A will get destroyed, so when A is moved into the data structure, A needs to be hollowed out so that whatever is left (a String object with no heap storage) can be safely destroyed on function exit.
In Rust the compiler knows you moved A, therefore there is nothing to destroy at the end of the function, no work needed (at runtime).
Suppose you've got a local String variable A. You will move A into a data structure which is going to live much longer and then your local function exits.
In C++ when the function exits, A will get destroyed, so when A is moved into the data structure, A needs to be hollowed out so that whatever is left (a String object with no heap storage) can be safely destroyed on function exit.
In Rust the compiler knows you moved A, therefore there is nothing to destroy at the end of the function, no work needed (at runtime).