我能从const valarray中得到const slice_array吗?

Can I get a const slice_array from a const valarray?

本文关键字:const slice array valarray      更新时间:2023-10-16

我有一个函数,它接受对valarray的const引用,我希望能够对数组进行切片,并将切片传递给另一个期望const slice_array的函数。我知道我可以使用操作符[]和切片从原始valarray中获得一个新的,复制的valarray,但我想避免复制。一切都是常量,所以我觉得应该没问题。然而,valarray下标操作符的文档在应用于非const valarray时只返回一个slice_array对象。这感觉是valarray类的一个主要缺陷。我错过什么了吗?如何获得const valarray的切片而不引起复制?

下面是我正在谈论的一个例子:

void foo( const valarray<double> &big_stuff )
{
    const slice_array<double> small_stuff = big_stuff[slice(start, size, stride)];
    bar( small_stuff );
}

谢谢!

如何获得const valarray的切片而不引起复制?

没有办法做到这一点,因为std::valarray不包含std::slice_array对于任何请求,所以它不会只给你链接(指针,引用)到你请求的std::slice_array

但是std::slice_array只能包含三个机器字,很难想象没有std::slice_array副本可以优化某些东西的情况。例如,从gcc/libstdc++(只有数据,函数剥离):

 template<typename _Tp>
  class slice_array {
    const size_t      _M_sz;
    const size_t      _M_stride;
    const _Array<_Tp> _M_array;
  };

_Array:

template<typename _Tp>
  struct _Array { _Tp* const __restrict__ _M_data; };