모드버스 통신처리를 최적화 하기위해 Span을 활용해 원 바이너리메모리에 직접적으로 Swap과 캐스팅 처리할수있도록 구현했다.
불필요한 가비지나 연산과정이 최소화 될듯하나 측정하거나 디버그 해보진 않았다.
아래는 사용예이다.
unsafe struct SwapBig<T> where T : unmanaged
{
static int size = sizeof(T);
static int siz = size - 1;
delegate void SwapAction(byte[] swap, Span<byte> raw, Span<byte> val, int i);
static SwapAction get = BitConverter.IsLittleEndian ? static (swap, raw, val, i) => { val[swap[i]] = raw[siz - i]; } : static (swap, raw, val, i) => { val[swap[i]] = raw[i]; };
static SwapAction set = BitConverter.IsLittleEndian ? static (swap, raw, val, i) => { raw[siz - i] = val[swap[i]]; } : static (swap, raw, val, i) => { raw[i] = val[swap[i]]; };
public T this[params byte[] swap]
{
get
{
T value;
fixed (void* _this_ = &this)
{
var raw = new Span<byte>(_this_, size);
var val = new Span<byte>(&value, size);
for (int i = 0; i < size; i++)
get(swap, raw, val, i);
}
return value;
}
set
{
fixed (void* _this_ = &this)
{
var raw = new Span<byte>(_this_, size);
var val = new Span<byte>(&value, size);
for (int i = 0; i < size; i++)
set(swap, raw, val, i);
}
}
}
}
https://m.dcinside.com/board/programming/2086917