我正在尝试在需要最小化动态分配的环境中工作,我很好奇切片函数在内存分配方面是如何工作的。我环顾四周,没有找到多少。
如果切片大小恒定,是否可以在堆栈上分配切片?
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)
那样优雅
亚当说了一些关于切片永远不会被分配的事情,但我仍然对让 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);
而第二个则要优雅得多。