【问题标题】:How to implement malloc operation in C#如何在 C# 中实现 malloc 操作
【发布时间】:2012-07-29 17:21:03
【问题描述】:
float **ThreadID;
int Nthreads;

如何在 C# 中执行以下任务?

ThreadID = (float **)malloc( Nthreads* sizeof(float *) );

【问题讨论】:

  • 你不会在 C# 中手动分配内存。
  • 您为什么需要这样做? .NET 运行时是托管运行时 - 您不需要管理自己的内存。
  • 如果有人想要更深入地控制内存分配怎么办。如果您可以连续分配内存,则存储有很大的优势,当您处理数据结构时就会明白这一点。
  • 如果有人想要更深入地控制内存分配怎么办。如果您可以连续分配内存,则存储有很大的优势,当您处理数据结构时就会明白这一点。

标签: c# memory-management


【解决方案1】:

您的应用程序需要非托管内存有什么原因吗? 否则正常的做法是

ThreadID = new float*[Nthreads];

这将为您分配一个新数组。如果在经常调用的函数中使用这种语句,则可能需要添加 stackalloc-keyword。否则缓慢的垃圾收集可能会导致内存消耗增加。使用stackalloc,它将被存储在堆栈中,并在离开函数时像任何其他局部变量一样被销毁。

ThreadID = stackalloc float*[Nthreads];

编辑:与 C# 中的所有指针一样,您需要为函数声明不安全的上下文,例如

unsafe int doSomething(){
   ...
}

【讨论】:

  • @RitchMelton: +1 指出我的错误
  • 使用 ThreadID = new float*[Nthreads];它给出了错误提示“无法将类型 'float*[]' 隐式转换为 'float**'”
【解决方案2】:

您可以尝试使用以下方法:

Marshal.AllocHGlobal 

详情请见MSDN here

【讨论】:

    【解决方案3】:
    float[][] ThreadId;
    int NThreads;
    
    ThreadId = new float[Nthreads][];
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 2011-12-04
      • 1970-01-01
      • 2010-11-21
      • 2011-02-01
      • 1970-01-01
      相关资源
      最近更新 更多