如何根据模板参数控制内存分配?

时间:2016-06-17 11:15:15

标签: c++ eigen

我正在查看Eigen矩阵类库和docs状态,可以使用以下模板参数实例化Matrix模板类:

Matrix<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>

其中Scalar是Matrix系数的类型(double,float,int,complex等等)。 RowsAtCompileTimeColsAtCompileTime分别是Matrix维度。

例如,可以如下实例化4x4浮点矩阵:

Matrix<float, 4, 4> matrix;

Eigen docs声明在前一种情况下,因为行在编译时是已知的,而对于“小型”矩阵,Matrix元素的内存是静态分配的。

但是,如果您选择动态分配内存(对于大型矩阵或因为您在编译时不知道行数和列数),则可以使用以下模板实例化,它将动态分配内存:

Matrix<float, Dynamic, Dynamic> matrix;

我的问题是如何使用C ++模板机制在概念上实现这一目标?由于我最感兴趣的是用于实现此目的的C ++技术,有人可以使用Stack类型给我一个简短的例子,其中内存分配以类似的方式控制吗?谢谢!

1 个答案:

答案 0 :(得分:3)

模板将部分专用来处理不同的分配。简而言之,

let formatter = NSDateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss Z"
formatter.dateFromString(timestamp)

显然,此示例中缺少许多接口,但这突出了模板特化的 mechanics 的重要部分,以及不同底层存储的详细信息。构造函数(在特化中)将执行动态分配。

实际上,人们可能会将存储的详细信息推迟到部分专业化的template <typename T, int N> struct Vector { T data[N]; }; static const int Dynamic = -1; template <typename T> struct Vector<T, Dynamic> { T* data; }; VectorStorage<T, Rows, Cols>将包含该类型的成员(使用自己的参数正确实例化),并且大部分接口只能实现一次......

Vector