Skip to content

Marshalling関係 #1

@yamachu

Description

@yamachu
  • 構造体をbyte配列にして渡す

Structs.cs

[MarshalAs(UnmanagedType.ByValArray,SizeConst=224)]
internal byte[] minimum_phase;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=120)]
internal byte[] inverse_real_fft;
[MarshalAs(UnmanagedType.ByValArray,SizeConst=120)]
internal byte[] forward_real_fft;

Core.cs

var forward_fft = new ForwardRealFFT();
synth.forward_real_fft = new byte[Marshal.SizeOf<ForwardRealFFT>()];
GCHandle gch = GCHandle.Alloc(synth.forward_real_fft, GCHandleType.Pinned);
Marshal.StructureToPtr(forward_fft, gch.AddrOfPinnedObject(), false);
gch.Free();
// 同様に

Structs.cs を IntPtr にして,確保した構造体を StructureToPtr でコピーしても同様?

  • 構造体をクラス定義にして渡す

Structs.cs

[StructLayout(LayoutKind.Sequential)]
public class WorldSynthesizer
{
    // 
    internal MinimumPhaseAnalysis minimum_phase;
    //
}
[StructLayout(LayoutKind.Sequential)]
internal class MinimumPhaseAnalysis
{
    //
}

Core.cs

synth.minimum_phase = new MinimumPhaseAnalysis();
//
  • World自体の実装を変えてメモリ管理を全て任せる

Structs.cs

internal IntPtr minimum_phase;
//

World の WorldSynthesizer 構造体の FFT 関連をポインタにして,World 側で確保するのが一番楽
構造体の中身見なくていいなら型宣言すら不要

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions