我正在尝试在需要最小化动态分配的环境中工作,并且我对切片函数在内存分配方面的工作方式感到好奇。我环顾四周,但没有发现太多。
如果它们的大小恒定,是否可以在堆栈上分配切片?
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!double(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);
虽然第二个要优雅得多。