profiling/performance/deep-into-move #1123
Replies: 6 comments 1 reply
-
其实大家应该明白int a[10000] == int a0, a1…a9999的。 普通数组再大也是普通变量,存在栈上,不是说编译器看你很大就把你和vec一起分配在堆上了。 这种事情最好是别盯着编译器优化,加个Box又不是什么难事,能很简单自己写好的没必要盯着玄学看,别哪天改了两行发现性能骤减甚至正确性出问题,结果错误藏在几年前就写好的底层模块…… |
Beta Was this translation helpful? Give feedback.
-
但凡学过点C++,这种基础类型的std::move是无效的,除非自己把结构体中的C style数组类型换成引用或者指针类型,当然碰到这种数据量很大的数组,一般都是选择开辟在堆上的,类比于C++这个时候就应该使用vector而不是原始数组类型或者array类型 |
Beta Was this translation helpful? Give feedback.
-
我的理解,希望大佬们批评指正: 这是rust的一种抽象,相当于让编译器来检测move行为是否规范。它是配合borrow checker使用的,在编译器后端可能会直接无视。 它并不是真正的内存move,毕竟无法在编译期确定所有的所有权归属,即不可能提前将数据存在合适的栈位置。也因此,某些地方Move依旧会发生进行拷贝。 实际上,完全可以在过borrow checker后,将所有move和copy全部无视掉,看成cpp里完全正常的传参、取return。 令人惊奇的是,若是正常地、较合理地使用Move的话,似乎很难出现大型的隐式Copy,因为这样的Rust的代码基本也是Cpp里面的最佳实践,很多都是可以被编译器探知并优化的(比如直接传指针过去,以及ROV & NROV),不会产生很大的内存复制消耗。 |
Beta Was this translation helpful? Give feedback.
-
首当其冲这个成语用错了 |
Beta Was this translation helpful? Give feedback.
-
666 |
Beta Was this translation helpful? Give feedback.
-
个人理解,copy就是一定会发生栈上的拷贝,而move由于语义上是移动(所有权转移),所以编译器可以将其优化成地址不发生改变,但是这种优化是在某些情况下不可用的。在这些情况下,move实际上和copy一样,都是将栈上内存复制到目标地址,然后编译器禁止再使用原来的变量。 |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
profiling/performance/deep-into-move
https://course.rs/profiling/performance/deep-into-move.html
Beta Was this translation helpful? Give feedback.
All reactions