2012-04-20 21 views
2

有像C和C++的_aligned_malloc这样的函数,但是我找不到任何东西来对齐内存中的.NET对象。有没有一种方法可以将new对齐为64字节的.NET对象?

+6

你为什么要使用C#但要关心内存级别的问题?高级语言的要点是将这些东西抽象出来。 – mellamokb 2012-04-20 03:02:21

+5

C#是一种托管语言。 CLR管理所有与内存有关的方面,所以你不必担心它们。 – dtb 2012-04-20 03:02:47

+1

.NET具有字段对齐属性。显然他们提供了一些控制记忆相关方面的设施。 – 2012-04-20 03:05:18

回答

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(); 
     } 
    } 
} 

 
+0

分配64字节的非托管内存,将其转换为char *,在其中设置一些文本,并将其打印到屏幕上。正好为str分配了64个字节。 – IDWMaster 2012-04-20 04:04:31

+0

64字节对齐64字节 – IDWMaster 2012-04-20 04:19:25

+0

如果你在一个64位的CPU int可能会长 – IDWMaster 2012-04-20 04:19:55

3

不可能在一般情况下,以有效地对准.NET对象上的64-因为即使对象在64位边界上开始,也不能保证它不会被重新定位到32位的奇数倍。出于某种原因,.net似乎认为值得强制将超过一千个double值的数组添加到大对象堆中,该大堆对象始终是64位对齐的,但是否则可怕,而且没有提供请求64位的有用方法即使这样做不应该困难或昂贵(在gen0中四舍五入对象大小;当将对象移动到较高编号的世代时,将奇数大小的对象配对)。

相关问题