3

C や C++ のような関数はありますが_aligned_malloc、.NET オブジェクトをメモリに配置するための関数が見つかりません。

4

2 に答える 2

3

一般に、64 ビット境界で .net オブジェクトを有効に配置することはできません。オブジェクトが 64 ビット境界で開始されたとしても、オブジェクトが奇数倍に再配置されないという保証はないからです。 32 ビット。何らかの理由で、.net は、1,000 を超えるdouble値の配列をラージ オブジェクト ヒープに強制する価値があると考えているようです。これは常に 64 ビットにアラインされていますが、そうでなければ恐ろしいものであり、64 ビット アラインメントを要求する有用な手段を提供していません。他のオブジェクトの場合でも、そうするのは難しくなく、費用もかかりません (gen0 のオブジェクト サイズを切り上げます。オブジェクトをより高い番号の世代に移動するときは、奇数サイズのオブジェクトをペアにします)。

于 2012-08-07T00:27:43.577 に答える
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();
        }
    }
}


于 2012-04-20T04:03:54.437 に答える