3

有类似_aligned_mallocC 和 C++ 的函数,但我找不到任何用于对齐内存中的 .NET 对象的东西。

4

2 回答 2

3

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

于 2012-08-07T00:27:43.577 回答
0

更正——您需要创建一个 P/Invocable DLL,然后调用它来执行对齐的 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();
        }
    }
}


于 2012-04-20T04:03:54.437 回答