回答
這是因爲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字節以上有一個跳躍,當尺寸加倍時,時間突然增加四倍。這就是後備開始使用的地方。
它不完全是16個字節,但是因爲結構體是按值傳遞的(只要你給它們一個方法,賦值它們就複製),它們一定不能太大。如果他們是,通過參考傳遞的東西更便宜。 4年後:我回答了這一點,對.NET知之甚少(仍然不太瞭解它)。在處理「多於或少於16字節?」時,Guffa的答案顯然更爲正確,因爲在這種大小下複製應該不會有太大影響。在構建巨大的結構時,我的回答可能需要記住。
一個64位指針仍然比128位結構體便宜。這個答案沒有多大意義。 – slugster 2010-03-13 10:21:57
「64位指針仍然比128位結構更便宜」。你爲什麼這麼說?獲取指針通常意味着堆分配和垃圾收集,這在.NET上很昂貴。編寫一個指針意味着會產生一個寫入屏障,這在.NET上也很昂貴。 – 2011-12-31 19:04:22
@slugster:一個8字節的引用可以比16字節的結構更便宜地複製,但是爲了引用它很有用,它必須標識堆中的一個對象。用一個16字節的數據創建一個堆對象並拷貝一個引用到它一百萬次可能比拷貝一個16字節的結構一百萬次更便宜,但是創建一個16字節的對象,複製兩次引用並放棄它,將是比複製16字節結構兩次(或者可能,甚至是二十次)要昂貴得多。 – supercat 2014-10-19 20:56:29
- 1. 爲什麼ToBase64String將16個字節的字符串更改爲24個字節
- 2. 爲什麼這個C++程序返回16個字節?
- 3. 解密返回16個字節而不是32個,爲什麼?
- 4. 爲什麼AES解密程序總是返回16個零(16個字節)?
- 5. 爲什麼基類的大小顯示16個字節?
- 6. 爲什麼Ruby openssl aes 128 cbc的前16個字節錯誤?
- 7. 爲什麼減少停留在16%?
- 8. 哪個更好?爲什麼?
- 9. 爲什麼struct字段顯示爲空?
- 10. 爲什麼offsetof(member)等於sizeof(struct)?
- 11. 大小爲16字節的泄露UIImage可能表明什麼?
- 12. 爲什麼「std :: vector <bool>」16字節的大小?
- 13. 「struct a a1 = {0};」不同於「struct a a2 = {5};」爲什麼?
- 14. 爲什麼linux的IPv4地址需要16個字節而不是4個
- 15. 128位(16字節)GUID被壓縮到多少位或字節?
- 16. 爲什麼struct struct cdev有kobject成員?
- 17. 如何從Java字符串中獲取正好16個字節
- 18. 爲什麼1字節等於8位?
- 19. AES加密16個字節
- 20. 爲什麼gcc在2次成功分配之間留下16個字節?
- 21. 爲什麼分配的變量地址之間有16個字節的差異?
- 22. 哪個代碼更好?爲什麼?
- 23. 數據庫 - 哪個更好,爲什麼?
- 24. 哪個LINQ語句更好,爲什麼?
- 25. 爲什麼字節b =(字節)0xFF等於整數-1?
- 26. 爲什麼打開調用兩個參數(struct inode *,struct file *)?
- 27. 由於IPV6需要128位(16字節),那麼爲什麼postgres CIDR數據類型的存儲空間爲24字節(8.1)和19字節(9.1)?
- 28. 如何將兩個字節轉換爲一個16位數字?
- 29. 定義一個小於一個字節的枚舉/爲什麼這個結構大於一個字節?
- 30. 爲AES加密填充字節[]爲16字節倍數
http://stackoverflow.com/questions/1082311/why-should-a-net-struct-be-less-than-16-bytes – 2010-03-13 10:06:39
也是一個愚蠢的http://stackoverflow.com/questions/2407691/c-struct-design-why-16-byte-is-recommended-size/2407869#2407869 – slugster 2010-03-13 10:23:47