2010-03-13 51 views
10

我正在學習struct;有些書建議創建結構,如果它的實例大小小於16字節爲什麼struct少於16個字節更好

爲什麼?

感謝您的回覆。

+0

http://stackoverflow.com/questions/1082311/why-should-a-net-struct-be-less-than-16-bytes – 2010-03-13 10:06:39

+0

也是一個愚蠢的http://stackoverflow.com/questions/2407691/c-struct-design-why-16-byte-is-recommended-size/2407869#2407869 – slugster 2010-03-13 10:23:47

回答

28

這是因爲16字節是編譯器開始將結構作爲內存塊複製而不是使用一個或兩個簡單移動指令的閾值。

編譯器優化複製結構,當它們很小時。例如8個字節的結構可以作爲單個64位值複製。一個16字節的結構可以複製爲一個或兩個奇異值(取決於處理器架構)。當結構大於16字節時,編譯器不會再嘗試優化移動,而後退就是調用複製一塊內存的方法。 (注意:根據編譯器的版本,16字節的閾值可能會有所不同,但它似乎是因爲它實際上試圖在新版本中超過這一點進行優化,但優化的代碼仍然是大量的移動指令,要複製到的目標仍然是單次移動操作參考)

編輯:
這是一個測試,我在我的64位系統的複製結構做的結果半十億倍:

struct 4 : 272 ms. 
struct 8 : 235 ms. 
struct 16 : 317 ms. 
struct 32 : 625 ms. 
struct 64 : 1280 ms. 
struct 128 : 4659 ms. 
struct 256 : 8020 ms. 

如您所見,低於16字節的時間不是線性的,雖然16 b yte是4個字節的四倍,不需要四倍長。超過16個字節的時間是線性的,所以時間翻倍。這就是它將開始使用多個步驟的地方。在64字節以上有一個跳躍,當尺寸加倍時,時間突然增加四倍。這就是後備開始使用的地方。

+0

你提出了一個朗朗的觀點 – Ricky 2010-03-13 10:19:07

+0

你的觀點從哪裏來? – Ricky 2010-03-13 10:19:36

+0

@瑞奇:多年來我做了一些測試。我在上面添加了當前的測試結果。 – Guffa 2010-03-13 10:43:18

1

它不完全是16個字節,但是因爲結構體是按值傳遞的(只要你給它們一個方法,賦值它們就複製),它們一定不能太大。如果他們是,通過參考傳遞的東西更便宜。 4年後:我回答了這一點,對.NET知之甚少(仍然不太瞭解它)。在處理「多於或少於16字節?」時,Guffa的答案顯然更爲正確,因爲在這種大小下複製應該不會有太大影響。在構建巨大的結構時,我的回答可能需要記住。

+0

一個64位指針仍然比128位結構體便宜。這個答案沒有多大意義。 – slugster 2010-03-13 10:21:57

+2

「64位指針仍然比128位結構更便宜」。你爲什麼這麼說?獲取指針通常意味着堆分配和垃圾收集,這在.NET上很昂貴。編寫一個指針意味着會產生一個寫入屏障,這在.NET上也很昂貴。 – 2011-12-31 19:04:22

+0

@slugster:一個8字節的引用可以比16字節的結構更便宜地複製,但是爲了引用它很有用,它必須標識堆中的一個對象。用一個16字節的數據創建一個堆對象並拷貝一個引用到它一百萬次可能比拷貝一個16字節的結構一百萬次更便宜,但是創建一個16字節的對象,複製兩次引用並放棄它,將是比複製16字節結構兩次(或者可能,甚至是二十次)要昂貴得多。 – supercat 2014-10-19 20:56:29

相關問題