将普通旧数据数组视为std :: array

时间:2018-02-16 09:25:01

标签: c++ memory-management stdarray

我们有一个大型代码库,主要用C编写。我们做了很多数值线性代数。

C中,我们使用double*,长度为3来模拟3d矢量。

C++中,我们使用std:array<double,3>来建模3d矢量。

我们有一个小模板库来重载许多运算符,例如

template <class T, size_t N>
std::array<T, N> operator+(const std::array<T, N> &array1, const std::array<T, N> &array2) {
    std::array<T, N> a;
    for (size_t i = 0; i < N; i++) {
        a[i] = array1[i] + array2[i];
    }
    return a;
}

问题出现了,当我们需要从C转到C++时(反过来说没有问题,因为我们可以使用.data()方法来访问对齐的内存)。我不喜欢制作每个类似c的3d矢量的副本,因为这在数字上会很昂贵。

我可以将pod数组视为std :: array,还是有办法以不分配新内存的方式初始化std :: array,但是使用了pod数组中的内存?

我正在考虑使用guideline support library中的gsl::span,但我想知道是否有更好的解决方案。

1 个答案:

答案 0 :(得分:-2)

你可以简单地施放:

double* c_array; // assign to whatever you like, length 3 or more
auto cpp_array = reinterpret_cast<std:array<double,3>*>(c_array);

这是有效的,因为std::array绝对只是一个包含单个C数组的结构。