簡體   English   中英

如何在沒有副本的情況下返回不再使用的結構的引用字段的值?

[英]How to return the value of a reference field of a struct that is no longer used without copy?

像這樣的代碼:

pub fn sample_from_categorical_logits(prob_logits: Tensor) -> (Tensor, Tensor) {
    let prob_obj = match prob_logits.size().len() {
        3 => Categorical::from_logits(prob_logits),
        2 => Categorical::from_logits(prob_logits.unsqueeze(1)),
        _ => panic!("illegal..."),
    };
    (prob_obj.sample(&[]), (*prob_obj.probs()).copy())//TODO: can copy be avoided?
}

我可以通過prob_obj.prob()獲得對象prob_obj字段的不可變引用。 現在我需要返回它的值,因為我需要讀取(僅)這個值進行一些計算,並進一步返回這個值和計算值。

Tensor是第三個結構,不實現Copy特征。

我知道我不能返回本地對象的引用。 但在這種情況下,由於我不再需要整個prob_obj對象,我想知道除了復制字段之外是否還有更有效的方法,比如在 C++ 中move

我用谷歌搜索,發現像CowMem::takeUnSafe的東西,但它們似乎不是這里的用例。

我想知道除了復制字段之外是否還有更有效的方法,比如在 C++ 中移動。

嗯,是的,搬家。 但是移動需要擁有對象的所有權,這意味着您需要一個probs()版本,它消耗對象以返回其位。

或者返回一個可變引用以使用mem::takemem::swap

就像你在 C++ 中所做的那樣,真的,你不能只是將東西從 const 引用中移出(充其量只是執行復制)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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