簡體   English   中英

在C#中,何時引用類型比值類型更有效?

[英]In C#, When is a reference type more efficient than a value type?

有沒有時間參考類型比值類型更有效? 為什么? 能給我舉個例子嗎 ?

任何時候你要在很多物體之間傳遞它。

每次調用帶有值類型的方法,或每次調用到另一個位置時,都需要值類型成員的完整副本。 如果您有相當多的成員,這可能會導致性能的巨大損失。

例如,假設您有一個具有20個int值的對象:

public class MyClass { int a; int b; int c; ... }
public class MyStruct { int a; int b; int c; ... }

如果我們這樣做:

MyClass class = new MyClass();
MyClass struct = new MyStruct();

this.CallSomeMethod(class); // Just copies one IntPtr reference!
this.CallSomeMethod(struct); // Needs to copy a large amount of data to run - 20x the other on x86, 10x on x64, since it's 20 Int32 values!

問題太寬泛,無法得到明確的答案。 一個示例案例可以是您擁有10k對象並將其傳遞給遞歸函數的情況。 如果你使用值類型,每次調用方法時,你都會復制整個事物。

可以訪問值類型成員而無需額外的間接級別。 一般來說,參考類型是一個很好的凝視點。 您應該對應用程序進行概要分析,如果通過引用成員而遇到嚴重的性能問題,則可以嘗試使用值類型(如果它適用於設計)。

對於非常小的結構,您可能更喜歡沒有分析的值類型。 特別是如果你的strct只包含四個字節值或類似的東西。 在64位平台上,每個引用(間接)都需要8字節的內存。 請記住,即將推出的x64 Windows版本可以在CPU寄存器中存儲8個字節。 如果您的結構小到8字節,則可以將其保存到寄存器中。

正如已發布的那樣,請記住,值必須完全按值調用復制。 如果結構大於8字節,則可能會對性能產生巨大影響。

如果效率高,則表示對CPU的指令較少:

  1. 值類型具有初始化默認值的默認構造函數,而引用類型默認為空引用。

  2. 更改一個值類型的值不會影響另一個值類型,而更改引用類型的值可能會更改其他引用類型的值。

我試着更多地考慮語義而不是性能,除非我描述那里確實存在問題。 因此,如果我想要一些行為類似值並具有值語義的東西,那么我使用一個結構,否則我使用一個類。

我相信大多數代碼都可以正常工作,就好像你的對象足夠復雜,性能成為一個問題,你可能不想要價值語義。

暫無
暫無

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

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