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



我正在研究特征矩阵类库,并且文档指出,可以使用以下模板参数实例化矩阵模板类:

Matrix<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>

其中 Scalar是矩阵系数的类型(double,float,int,复杂等)。RowsAtCompileTimeColsAtCompileTime分别是矩阵尺寸。

例如,可以实例化浮子的4x4矩阵:

Matrix<float, 4, 4> matrix;

特征文档指出,在上一种情况下,由于行是在编译时已知的,对于"小型"矩阵,矩阵元素的内存是静态分配的。

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

Matrix<float, Dynamic, Dynamic> matrix;

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

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

template <typename T, int N>
struct Vector {
    T data[N];
};
static const int Dynamic = -1;
template <typename T>
struct Vector<T, Dynamic> {
    T* data;
};

显然,在此示例中,许多接口都缺少,但是这突出了模板专业化的 Mechanics 的重要部分,以及不同基础存储的细节。构造函数(在专业中)将执行动态分配。

实际上,可以将存储的细节推迟到部分专业化的VectorStorage<T, Rows, Cols>Vector将包含该类型的成员(使用其自己的参数正确实例化),并且大部分接口只能实现一次...

template <typename T, int N>
struct VectorStorage {
    VectorStorage(const size_t) {}
    T data[N];
};
static const int Dynamic = -1;
template <typename T>
struct VectorStorage<T, Dynamic> {
    VectorStorage(const size_t n) : data(new T[n]) {}
    ~VectorStorage() { delete[] data; }
    // define copy ops, etc.
    T* data;
};
template <typename T, int N>
class Vector {
  public:
    Vector(const size_t n) : storage(n) {}
    T operator[](const size_t i) const { return storage.data[i]; }
    // etc.
  private:
    VectorStorage<T,N> storage;
};

最新更新