-
Notifications
You must be signed in to change notification settings - Fork 270
/
StructureToPtr.cs
77 lines (63 loc) · 2.21 KB
/
StructureToPtr.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.
using BenchmarkDotNet.Attributes;
using MicroBenchmarks;
using System;
using System.Runtime.InteropServices;
namespace Interop
{
[BenchmarkCategory(Categories.Runtime)]
public class StructureToPtr
{
[Benchmark]
public unsafe int MarshalStructureToPtr()
{
NonBlittableStruct str = new NonBlittableStruct
{
i = 1,
s = 42,
b = true
};
byte* stackSpace = stackalloc byte[Marshal.SizeOf<NonBlittableStruct>()];
Marshal.StructureToPtr(str, (IntPtr)stackSpace, false);
return *(int*)stackSpace;
}
[Benchmark]
public unsafe NonBlittableStruct MarshalPtrToStructure()
{
byte* stackSpace = stackalloc byte[Marshal.SizeOf<NonBlittableStruct>()];
*(int*)stackSpace = 1;
*(short*)(stackSpace + sizeof(int)) = 42;
*(byte*)(stackSpace + sizeof(int) + sizeof(short)) = 1;
return Marshal.PtrToStructure<NonBlittableStruct>((IntPtr)stackSpace);
}
[Benchmark]
public unsafe int MarshalDestroyStructure()
{
NonBlittableAllocatingStruct str = new NonBlittableAllocatingStruct
{
i = 42,
s = "Hello World!"
};
byte* stackSpace = stackalloc byte[Marshal.SizeOf<NonBlittableAllocatingStruct>()];
Marshal.StructureToPtr(str, (IntPtr)stackSpace, false);
int returnValue = *(int*)stackSpace;
Marshal.DestroyStructure<NonBlittableAllocatingStruct>((IntPtr)stackSpace);
return returnValue;
}
public struct NonBlittableStruct
{
public int i;
public short s;
[MarshalAs(UnmanagedType.U1)]
public bool b;
}
public struct NonBlittableAllocatingStruct
{
public int i;
[MarshalAs(UnmanagedType.LPStr)]
public string s;
}
}
}