如何在C#中创建64字节边界对齐的数组?
在C#中创建64字节边界对齐的内存块(适配AVX指令要求)
我需要创建一个按64字节边界对齐的数组,因为要调用使用AVX的DLL,而AVX要求数据必须对齐。我需要在C#中实现类似以下C语言的功能:
void* ptr = _aligned_malloc(64 * 1024, 64); int8_t* memory_ptr = (int8_t*)ptr;我认为C#无法直接创建此类对齐边界的数组,考虑过创建长度为x+64的byte数组,再通过偏移生成一个对齐的覆盖数组,但不知如何实现且避免内存泄漏。(内存泄漏问题导致我不愿通过DLL创建数组再传给C#,除非有合适的方法)
解决方案代码
借助可行方法,我实现了如下代码,可帮助有相同需求的开发者:
public class Example : IDisposable { private ulong memory_ptr; public unsafe Example() { memory_ptr = (ulong)NativeMemory.AlignedAlloc(0x10000, 64); } public unsafe Span<byte> Memory => new Span<byte>((void*)memory_ptr, 0x10000); public unsafe void Dispose() { NativeMemory.Free((void*)memory_ptr); } }
代码说明
- 使用
NativeMemory.AlignedAlloc直接分配满足64字节对齐要求的内存块,示例中分配大小为64KB(0x10000) - 通过
Span<byte>封装内存地址,便于在C#中进行便捷的读写操作 - 实现
IDisposable接口,在对象生命周期结束时调用NativeMemory.Free释放内存,彻底避免内存泄漏问题
内容的提问来源于stack exchange,提问作者BJury
相关产品推荐
相关产品推荐

