有没有办法将`new`一个.NET对象与64字节对齐?

时间:2012-04-20 02:59:36

标签: c# memory-alignment

对于C和C ++,有_aligned_malloc等函数,但我找不到任何用于在内存中对齐.NET对象的内容。

2 个答案:

答案 0 :(得分:3)

在一般情况下,在64位边界上有效地对齐.net对象是不可能的,因为即使对象在64位边界上开始,也不能保证它不会被重定位到64位边界。 32位的奇数倍。出于某种原因,.net似乎认为强制超过一千double个值的数组到大对象堆是值得的,它总是64位对齐但是其他方面很糟糕,但却没有提供任何有用的方法。为其他对象请求64位对齐,即使这样做不应该是困难或昂贵的(在gen0中舍入对象大小;将对象移动到更高编号的代,将奇数大小的对象配对)。

答案 1 :(得分:0)

更正 - 您需要创建一个P / Invocable DLL,然后调用它来执行aligned_malloc函数。示例C ++代码


#include <malloc.h>

extern "C" {
__declspec(dllexport) void* alMlc(size_t size, size_t alginment) {
    return _aligned_malloc(size,alginment);
}
}

C#代码(假设您创建的DLL名为mallocer.dll)


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace ConsoleApplication7
{
    class Program
    {
        [DllImport("mallocer.dll", CallingConvention=CallingConvention.Cdecl)]
        static extern IntPtr alMlc(int size, int alignment);
        static void Main(string[] args)
        {
            unsafe
            {
                //Allocate exactly 64 bytes of unmanaged memory, aligned at 64 bytes
                char* str = (char*)alMlc(64,64).ToPointer();
                str[0] = 'H';
                str[1] = 'i';
                str[2] = '!';
                str[3] = '\0';

                Console.WriteLine(System.Runtime.InteropServices.Marshal.PtrToStringAuto(new IntPtr(str)));

            }
            Console.ReadKey();
        }
    }
}