传递的1D数组用作2D数组

时间:2015-06-09 01:02:14

标签: c arrays performance

我有一个1D数组float64 arr[60]用于存储来自DAQ的电压值。数组填充如下:

10 SAMPLES_PER_CHANNEL, 6 CHANNELS, grouped by channel
transducer_0    transducer_1   ...  transducer_6
[0, 1 ..., 9,   10, 11 ..., 19 ...  50, 51 ..., 59]

我想将这些数据存储到一维指针数组中并传递给定义为bool func2(int samples, double* const* arr2)

的函数
[channel 0]                 [channel 1]                       [channel 5]
{val 0, val 1 ...val 9},    {val 10, val 11 ...val 19},  ...

值正在以5000Hz更新,因此我想知道最有效的方法是什么,这样我就不会复制任何数据。

由于arr中的数据存储在内存中对于1D或2D数组是相同的,我能够只是转换指针吗?

1 个答案:

答案 0 :(得分:1)

template<size_t stride, class T, size_t N, size_t count = N/stride>
std::array<T*, count> make_2d( T(&raw)[N] ) {
  std::array<T*, count> retval;
  for (size_t i = 0; i < count; ++i)
    retval[i] = raw + i*stride;
  return retval;
}

这将返回指向较低维度的array指针

要致电func2,只需执行以下操作:

func2( 10, make_2d<10>(arr).data() );

这假设样本数是固定的,并且您需要一个指向每个样本的指针数组。

以上是没有动态分配的。

请注意,arr必须是double arr[60]类型才能使上述工作正常。 float64有望成为double的别名。如果arr是一个函数参数,即使它具有数字60,它也不是double arr[60],但是&#34;真的是&#34; double*

这可以通过一些创意铸造来解决:

using parr_t = double(*)[60];
func2( 10, make_2d<10>(*(parr_t)(arr)).data() );

如果重复使用样本重新填充相同的数组(在内存中的相同位置),您可以执行一次make_2d调用,并且每次都使用它。