我有以下结构体:
[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))
?它们有什么区别?
注意,分配的内存必须被固定。
AllocCoTaskMem
更高效。AllocHGlobal
调用了LocalAlloc
,而LocalAlloc
有以下注释:"本地函数的开销更大,提供的内存管理功能比其他内存管理函数更少"。请参见 https://msdn.microsoft.com/en-us/library/windows/desktop/aa366723(v=vs.85).aspx - IamIC