Iは、以下の構造体を有する: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
}
をIは、上記構造体のインスタンスを格納するアンマネージメモリを割り当てる必要があります。この構造体へのポインタは、waveOutのwin32 API関数(waveOutPrepareHeader、waveOutWrite、waveOutUnprepareHeader)に渡されます。
Marshal.AllocHGlobal()
またはMarshal.AllocCoTaskMem()
を使用しますか?違いはなんですか?sizeof(WAVEHDR)
またはMarshal.SizeOf(typeof(WAVEHDR))
をメモリ割り当て方法に渡す必要がありますか?違いはなんですか?
割り当てられたメモリは固定する必要があります。
2つの割り当て関数の間にパフォーマンスの違いはありますか? – DxCK
'AllocCoTaskMem'がより効果的です。 'AllocHGlobal'は' LocalAlloc'を呼び出します。これは、「ローカル関数はオーバーヘッドが大きく、他のメモリ管理関数よりも少ない機能しか提供しません」というメモがあります。 https://msdn.microsoft.com/en-us/library/windows/desktop/aa366723(v=vs.85).aspxを参照してください。 – IamIC