2012-11-03 77 views
12

我已經寫了下面的擴展方法來連接在Windows運行時適用的兩個IBuffer對象:連接兩個Windows運行時緩衝區的最佳方式是什麼?

public static IBuffer Concat(this IBuffer buffer1, IBuffer buffer2) 
{ 
    var capacity = (int) (buffer1.Length + buffer2.Length); 
    var result = WindowsRuntimeBuffer.Create(capacity); 
    buffer1.CopyTo(result); 
    buffer2.CopyTo(0, result, buffer1.Length, buffer2.Length); 
    return result; 
} 

這是處理這一最有效的方法是什麼?有更好還是更簡單的方法?

我評論了Best way to combine two or more byte arrays in C#,但我不認爲我應該轉換字節數組。

+1

我發現這是不完整的,缺少:'''result.Length = capacity;''' –

回答

3

根據MSDN:

當你實現了IBuffer接口,你必須實現IBufferByteAccess接口,這是直接訪問緩衝區中的COM接口。 C++調用者使用此接口來避免製作緩衝區的副本。

IBufferByteAccess具有以下方法:

HRESULT Buffer(
    [out] byte **value 
); 

如果在C++編寫,可以使用該接口來促進實現數據複製效率。但是,在您的方法中使用的class System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensions也是使用本機代碼實現的,因此它幾乎可以充分利用接口的優勢。從託管代碼調用方法WindowsRuntimeBufferExtensions.CopyTo應該像在本機代碼中實現等效代碼一樣快,並調用該實現(除非定製的實現會進行較少的驗證)。

+0

對於那些有興趣研究類似問題(與WinRT的實現方面有關)的人來說,看看http://stackoverflow.com/a/13240181/118478。 –

+0

好吧,但最終緩衝區仍然是一個字節數組?或者它更像一個流?它是坐在堆棧上的值類型,還是需要管理的堆對象?該文檔在這方面很糟糕! –

+1

這裏是我對這個主題的猜測:它存儲在堆棧上的可能性很小(因爲可能大的大小)。它必須將數據存儲爲字節數組,否則從IBufferByteAccess :: Buffer方法返回的指針將不可用。它可能位於託管堆之外,因爲底層實現不受管理。但是,從以下鏈接看起來它存儲在託管堆中(並且在本地代碼中使用時固定):http://answers.flyppdevportal.com/categories/metro/csharpvb.aspx?ID=72fd199b-f191-46ca -9617-66c71954af41 –

相關問題