D 内存分配与Mir

D 内存分配与Mir,d,mir,D,Mir,我试图在一个需要最小化动态分配的环境中工作,我很好奇切片函数在内存分配方面是如何工作的。我环顾四周,没找到多少 如果切片大小不变,是否可以在堆栈上分配切片 import std; @nogc void main() { import mir.ndslice; import mir.ndslice.topology; import mir.blas : gemv, gemm; scope double[9] aData = 0; s

我试图在一个需要最小化动态分配的环境中工作,我很好奇切片函数在内存分配方面是如何工作的。我环顾四周,没找到多少

如果切片大小不变,是否可以在堆栈上分配切片

import std; 
@nogc void main()
{          
    import mir.ndslice;
    import mir.ndslice.topology; 
    import mir.blas : gemv, gemm;

    scope double[9] aData = 0;
    scope double[3] vData = [1, 2, 1]; 
    scope double[3] cData;

    auto A = aData.sliced.sliced(3, 3);
    auto v = vData.sliced.sliced(3, 1);
    auto c = cData.sliced.sliced(3, 1);

    A.diagonal[0] = 2;
    A.diagonal[1] = 1;
    A.diagonal[2] = 0;

    // c = 1 * A * v + 0 * c
    gemm!double(1, A, v, 0, c);

}
进行了相当多的实验,得到了我的零GC(当然是负writeln)线性代数。看起来很笨重,我希望能有更好的,像在切片

最近又一次发现了D,并试图看看它是否有机会在需要线性代数算法的情况下,为一些机器人项目决定性地做这件事

可能不应该使用gemm,但不想挖掘gemv。不像
slice那样优雅!双(3,3)

Adam说了一些关于从未分配切片的事情,但我仍然对释放GC保持警惕

我通常与许多直流电机一起进行运动学模拟。毫秒级的时序是关键的,D建议它可以是这样的,所以我检查出来,因为C++是很痛苦的工作。 尽管我不得不问为什么这不起作用

    double[9] a_data;
    scope A = a_data.sliced(3, 3);
当这发生时

    auto a_data = new double[9]; // Gah new?!
    scope A = a_data.sliced(3, 3);

而第二个则要优雅得多。

Silces本身从未分配,它们只是指向现有内存。你可以把堆叠的东西切成薄片。唯一需要注意的是,当您附加到一个片时,它会创建一个新的内存块。所以答案取决于你的背景。。。。你打算切什么?你打算用它做什么?我在线性代数中使用恒定大小的切片。就像我想做一个线性变换,a*x,a在编译时是3x3,x在编译时是3x1。我希望通过关闭GC并使用尽可能多的堆栈分配来完成一些确定性编程。哦,您可能只需要执行
a_data[]。切片(3,3)
!这周我一直很忙,这就是为什么我还没有完成完整的打字,但简短的版本是slice操作符-
[]
东西-将任何内存块转换为动态片。许多函数期望动态切片,但并不关心它们实际指向什么。当它看到
double[9]
时,它认为这是一个要复制的按值块。。。但是,
double[]
是一个按引用(排序)指向的块
a_data[]
在不复制的情况下切片。现在我想知道是否有一种方法可以将数组与数据绑定在一起,以实现像
slice这样简单的实例化!双(3,3)
。但不管怎样谢谢你的时间。你说的很管用。期待着那份书面报告。