如何以字节为单位找出动态特征向量的大小?

How to find out the size of a dynamic Eigen vector in bytes?

我要计算向量的大小。如果我写这段代码:

    Eigen::Matrix<float, 6, 1, Eigen::ColMajor> staticVector;
    std::cout << "sizeInBytes: " << sizeof (staticVector) << std::endl;

输出是:

sizeInBytes: 24

但是如果我写:

    Eigen::Matrix<float, Eigen::Dynamic, 1, Eigen::ColMajor> dynamicVector;
    dynamicVector.resize(6);
    std::cout << "sizeInBytes: " << sizeof (dynamicVector) << std::endl;

输出是:

sizeInBytes: 16

好的,sizeof (vector) 没有显示动态向量的实际大小。我应该使用什么?我会尝试 sizeof (float) * vector.size()sizeof (float) * vector.size() + sizeof (vector),但不确定这是否是正确的选项。那我需要什么?

如果Eigen::Matrix的数组都在堆栈中,那么sizeof应该return正确的值。这对于小型矩阵来说非常有用,但对于最大的矩阵来说可能会很危险,因为它可能会导致堆栈溢出。

如果数据存储在堆中,那么您需要制作一个添加堆栈和堆内存的方法,然后 returns 它。这将是一个可能的例子:

template<class T, size_t ROWS, size_t COLS, Eigen::SomeEnumType>
class Matrix {
    // ...
  private:
    std::array<std::array<T, COLS>, ROWS> *data;

  public:
    Matrix() { data = new std::array<std::array<T, COLS>, ROWS>(); }

    // Assumes all dynamically allocated memory is the data.
    size_t sizeInBytes() const { return sizeof(T) * ROWS * COLS + sizeof(*this); }
}; 

关于评论中的关注:

I am trying to transfer a dynamic vector to the GPU using Cuda

我很少使用 CUDA,所以我可能是错的,但是 IIRC 是通过类似 memcpy 的操作将东西放入 GPU 的唯一方法。这对于 vector 来说很难甚至不可能,因为 vector 包含彼此相距很远的堆栈和堆数据。最好的方法是在对象内部分配所有数据(因此它在内存中是连续的),然后如果你害怕堆栈溢出,只需在堆上分配整个对象:

template<class T, size_t ROWS, size_t COLS, Eigen::SomeEnumType>
class Matrix {
    // ...

    std::array<std::array<T, COLS>, ROWS> data;
}; 

int main() {
  auto *mat = new Eigen::Matrix<float, 6, 1, Eigen::ColMajor>(...);
  void *GPU_mat = malloc_GPU(sizeof(*mat));
  memcpy_to_GPU(GPU_mat, mat, sizeof(*mat));
}