根据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