簡體   English   中英

返回值為void時的C#out參數

[英]C# out parameter when return value is void

這個 XNA方法有兩個矩陣相乘有什么好處嗎?

public static void Multiply (
     ref Matrix matrix1,
     ref Matrix matrix2,
     out Matrix result
)

為什么結果是out參數而不是返回? 使用簡單的返回值是否有任何速度或內存優勢? 考慮到Matrix是一個結構,這與它有什么關系嗎? 我可以理解為什么matrix1matrix2是ref變量,所以它不必復制它們,但我不明白為什么第三個是out參數而不是return或ref變量。

是的,一個重要的。 Matrix類型違反了.NET編程的一個指導原則,結構不應大於16個字節。 通常是4個int字段。 Matrix有16個浮點字段,總共64個字節。

16字節建議與傳遞給生成的機器代碼中的方法或從生成的機器代碼中的方法傳遞的方式相關。 即使是x86核心,特別是缺乏CPU寄存器的核心,也有足夠的寄存器允許將結構存儲在CPU寄存器而不是堆棧幀中。 但是,如果它不適合,那么結構將通過堆棧框架。 並且在呼叫和接收時都被復制。 這太貴了。 同樣適用於返回值。

此費用的解決方法是通過ref或out傳遞結構值。 就像Multiply方法一樣。 現在它只需要一個指向結構的指針,在32位內核上傳遞4個字節。 每次代碼使用結構字段時都必須取消引用指針的開銷。 哪個好,這也是類對象所需要的。

可以說是出於同樣的原因:所以不必復制它(因為它是一個值類型)。 但是,我不知道編譯器是否可以忽略這個副本以及在什么情況下 - 如果可以的話,那么這已經是一種丑陋的做事方式,不會給你任何東西。

還要記住,可變值類型會在開始時散發出難聞的氣味

是的,有性能優勢。 考慮到它是一個值類型,性能更好,並且使其成為out參數允許它從被調用者封送回調用者。

查看OutAttributeBlittable和Non-Blittable類型的備注

暫無
暫無

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

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