我在理解MemoryMappedViewStream.PointerOffset屬性時遇到了一些問題。在這個簡單的單元測試中,我期望流的PointerOffset等於500000,但它是41248.流的長度是10000,但至少這是正確的。 _fakeDataPath是一個100萬字節的文件。MemoryMappedViewStream.PointerOffset有錯誤的值
[TestMethod]
public void CheckViewHasCorrectOffset()
{
using (var mmf = MemoryMappedFile.CreateFromFile(_fakeDataPath))
{
using (var stream = mmf.CreateViewStream(500000, 10000))
{
Assert.AreEqual(500000, stream.PointerOffset);
}
}
}
單元測試輸出是...
Assert.AreEqual failed. Expected:<500000>. Actual:<41248>
的[來源](https://referencesource.microsoft.com/#System.Core/System/IO/MemoryMappedFiles/MemoryMappedView.cs,91bd2847a1fb80e7)揭示了這是怎麼回事:'PointerOffset'只是返回傳入到私有'MemoryMappedView'構造函數中的內容,並且它們傳遞給'extraMemNeeded',該方法中的註釋表示:「extraMemNeeded是我們在請求視圖啓動之前分配的額外內存量」,並且是(ulong)offset%(ulong)MemoryMappedFile.GetSystemPageAllocationGranularity();':64k常見:'50 0000%(64 * 1024)= 41248'。可能是一個錯誤。 – Quantic