簡體   English   中英

使用切片和使用對數組的引用作為參數有什么區別?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM