根據http://referencesource.microsoft.com/#mscorlib/system/runtime/interopservices/safebuffer.cs爲什麼使用Marshal.AlignedSizeOfStruct <T>代替SafeBuffer.WriteArray中的Marshal.SizeOfStruct <T><T>和SafeBuffer.ReadArray <T>?
SafeBuffer
使用結構類型的對齊大小而不是結構類型的實際大小。看起來這會在編寫需要密集打包的結構數組時以及從緩衝區中先前存在的密集打包的非結構數組結構讀取時導致對齊問題。在第一種情況下,使用對齊而不是實際大小會導致不需要的填充字節。第二,數據被破壞。我有兩個問題(4真的,但3都跟):
- 有沒有解決這個其他的方式比手動校準使用順序調用訪問
SafeBuffer.Write<T>
/Read<T>
(這是比較慢),或開溝SafeBuffer
類(因此完全不錯UnmanagedMemoryAccessor
類)? - 這種選擇背後的原因是什麼?爲什麼CLR在非託管內存上強制執行它自己的對齊要求?爲什麼這不被視爲一個錯誤?
_「該框架沒有合理的方法來猜測MMF另一側的代碼是什麼樣的」_I ____ _ _ _ _ _ _ _ _ _ m不使用內存映射文件。我使用了一個自定義的SafeBuffer子類來包裝一些無人的內存。 B.如果CLR無法猜測,它至少可以讓客戶端指定它想要的對齊方式。事實上,我應該能夠通過StructLayoutAttribute來設置結構的大小和內存佈局,這表明它在轉換爲指針時會受到尊重。 – Benjamin 2014-09-04 18:50:46
你當然在跟錯誤的人說話。改用微軟。或者只是編寫你自己的SafeBuffer版本。 – 2014-09-04 18:52:55
我來這裏看看我是否脫離基地。對不起,如果它看起來像我爭論。無論如何,我最終可能會與微軟交談並編寫自己的版本。謝謝您的幫助。 – Benjamin 2014-09-04 19:59:33