2012-04-20 2 views
2

は、CおよびCのための_aligned_mallocのような機能があります++が、私はメモリ内の.NETオブジェクトを整列させるための何かを見つけることができません。64バイトに整列された.NETオブジェクトを `new`する方法はありますか?

+6

なぜあなたは、C#を使用しますが、メモリレベルの問題を気にするのでしょうか?これらの種類のものを抽象化することは、高水準言語の全体のポイントです。 – mellamokb

+5

C#は管理された言語です。 CLRは、すべてのメモリ関連の面を管理しているため、心配する必要はありません。 – dtb

+1

.NETにはフィールドアライメント属性があります。明らかに、メモリ関連の側面を制御するためのいくつかの機能を提供します。 –

答えて

0

CORRECTION - あなたは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(); 
     } 
    } 
} 

 
+0

64 MBのアンマネージメモリを割り当て、char *にキャストし、そこにテキストを設定し、それを画面に出力します。 strには正確に64バイトが割り当てられます。 – IDWMaster

+0

そして、64バイトは64バイトで整列されます – IDWMaster

+0

64ビットCPUを使用している場合、intは代わりに長くなることがあります – IDWMaster

3

それは有益64上の.NETオブジェクトを整列させる一般的なケースでは可能ではありませんオブジェクトが64ビット境界から始まっても、32ビットの奇数倍に再配置されないという保証はないからです。何らかの理由で、.NETは、それは常に64ビットの整列であるが、それ以外は恐ろしいです、まだ64ビットを要求する有用な手段を提供していないラージオブジェクトヒープに超える千double値の配列を強制的に価値があると考えているようですそのようにすることは困難でも費用もかかりませんが(他のオブジェクトを高次の世代に移動するときは、奇数サイズのオブジェクトをペアにするときにgen0のオブジェクトサイズを切り上げるべきではありません)。

関連する問題