我有以下結構:Marshal.AllocHGlobal VS Marshal.AllocCoTaskMem,Marshal.SizeOf VS的sizeof()
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
public struct WAVEHDR
{
internal IntPtr lpData; // pointer to locked data buffer
internal uint dwBufferLength; // length of data buffer
internal uint dwBytesRecorded; // used for input only
internal IntPtr dwUser; // for client's use
internal uint dwFlags; // assorted flags (see defines)
internal uint dwLoops; // loop control counter
internal IntPtr lpNext; // reserved for driver
internal IntPtr reserved; // reserved for driver
}
我需要分配非託管存儲器來存儲上述結構的實例。指向此結構的指針將傳遞給waveOut win32 API函數(waveOutPrepareHeader,waveOutWrite,waveOutUnprepareHeader)。
- 我應該用
Marshal.AllocHGlobal()
還是Marshal.AllocCoTaskMem()
?有什麼不同? - 我應該通過
sizeof(WAVEHDR)
或Marshal.SizeOf(typeof(WAVEHDR))
內存分配方法?有什麼不同?
請注意,分配的內存必須被固定。
兩個分配函數之間是否存在任何性能差異? – DxCK 2011-01-15 15:25:21
'AllocCoTaskMem'更高效。 'AllocHGlobal'調用'LocalAlloc',它有以下注意:「本地函數比其他內存管理函數具有更大的開銷並提供更少的功能。」請參閱https://msdn.microsoft.com/en-us/library/windows/desktop/aa366723(v=vs.85).aspx – IamIC 2017-08-11 09:15:20