C 中誰最快 結構還是類?

2022-01-12 13:31:59 字數 2399 閱讀 3654

在記憶體當道的日子裡,無論什麼時候都要考慮這些**是否會影響程式效能呢?

在現在的世界裡,幾乎不會去考慮用了幾百毫秒,可是在特別的場景了,往往這幾百公釐確影響了整個專案的快慢。

通過了解這兩者之間的效能差異,希望幫助大家在合適的場景裡選擇正確的編碼。

public class pointclass

public int y

public pointclass(int x, int y)

}public class pointclassfinalized : pointclass

~pointclassfinalized()

}public struct pointstruct

public int y

public pointstruct(int x, int y)

}public class structstest : performancetest

return true;

}protected override bool measuretestb()

return true;

}protected override bool measuretestc()

return true;}}

有乙個pointclass和乙個pointstruct,這兩者用於存放x 和y 兩個變數,而且還有乙個pointclassfinalized

方法measuretesta建立了100萬個pointclassfinalized例項

方法measuretestb建立了100萬個pointclass例項

方法measuretestc建立了100萬個pointstruct例項

您認為哪種方法最快?

measuretestbmeasuretestc這兩個方法的唯一不同在於乙個是建立類 乙個是建立結構。

measuretestc僅在17毫秒內完成分配並執行,比measuretestb方法快8.6倍!

為什麼會出現這樣的事情,這裡發生了什麼?

不同的在於結構和類如何儲存在記憶體中。

下面是pointclass例項 記憶體布局:

該列表是乙個區域性變數,存放在堆疊中。引用堆上的一組pointclass例項

pointclass是乙個引用型別,存放在堆上。

該列表僅維護乙個陣列,指向儲存在堆上pointclass例項。

觀察到上圖的黃色箭頭,在堆上引用了很多例項。

陣列是一組相同的物件,measuretestb這個方法是將一組相同的物件存放在陣列中。

當訪問指定陣列元素時,.net執行時需要檢索物件引用,然後「跟隨」引用以獲取pointclass例項。

當陣列元素超出範圍時,.net垃圾收集器就會開始**pointclass物件記憶體,在measuretesta方法中 的pointclassfinalized類 其實增加了額外時間。

.net framework在單個執行緒上執行所有終結器,執行緒必須在垃圾**器可以**記憶體之前依次處理1,000,000個物件。

可以看到measuretestameasuretestb慢1.7倍。

我們來看看pointstruct的記憶體布局:

結構是值型別,所有pointstruct例項都儲存在陣列本身中。堆上只有乙個物件。

初始化陣列,.net執行庫可以將x和y值直接寫入陣列裡。無需在堆上建立新物件,也不需要引用它。

當訪問指定陣列元素時,.net執行時可以直接檢索結構。

當超出範圍時,.net垃圾**器只需要處理單個物件。

我們總要使用結構嗎?要分情況看:

C 與C 誰更強?還是關公戰秦瓊

我一直不明白c 真的比c 強大嗎?望高手指點。困惑1.為什麼飛信之前的版本用.net做的,感覺不是很好用,最終放棄了.net而使用c 重寫了。感覺重寫之後的版本好一點。難道是他們的技術不好?還是c 真的比c 強大嗎?困惑2 為什麼qq一直使用c 開發。雖然qq開發的時候c 還是最主流的,c 還不是那...

C 中的結構與類

c corner今天發表了bechir bejaoui的一篇文章 what really make difference between structures and classes?關於結構和類的區別其實是老生常談,不過本文總結得較為全面,所以翻譯過來給大家共享。總結起來,兩者共有如下區別 2 據...

C 中的結構與類

c corner 今天發表了bechir bejaoui的一篇文章 what really make difference between structures and classes?總結起來,兩者共有如下區別 2 據第1點可以得出結論,那就是類物件通常用來傳遞大資料,而結構物件則用來傳遞小資料。...