[英]What is the difference between taking a slice and taking a reference to an array as argument?
采取切片有什么區別:
fn relu(xs: &mut [f64]) {
xs.iter_mut().for_each(|x| *x = x.max(0.0));
}
並引用一個數組
fn relu<const L: usize>(xs: &mut [f64; L]) {
xs.iter_mut().for_each(|x| *x = x.max(0.0));
}
作為論據?
有它的用途還是一個比另一個更好?
好吧,切片更通用,因為可以使用的類型更多:
fn relu(xs: &mut [f64]) {
xs.iter_mut().for_each(|x| *x = x.max(0.0));
}
您可以通過&mut Vec
、 &mut []
或&mut [_; N]
調用relu
&mut [_; N]
(幾乎任何你可以從中制作切片的東西,記住切片只是一些連續序列的視圖),因為這些類型可以用作切片。
同時:
fn relu<const L: usize>(xs: &mut [f64; L]) {
xs.iter_mut().for_each(|x| *x = x.max(0.0));
}
只能在[f64; L]
[f64; L]
,並且為每個使用的L
生成一個新的 function,在這種情況下,這幾乎是資源的損失。
正如@Masklinn 評論的那樣:
OTOH 對數組的引用意味着迭代大小在編譯時肯定是已知的,這可以允許優化切片版本可能無法解決的問題。 因此,有時使用數組引用作為優化輔助是有意義的(在這種情況下,relu 可能是內聯的主要候選者,因此重要的一點實際上是調用者中的類型)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.