【问题标题】:Can I get a const slice_array from a const valarray?我可以从 const valarray 中获取 const slice_array 吗?
【发布时间】:2015-10-20 02:15:42
【问题描述】:

我有一个接受对 valarray 的 const 引用的函数,我希望能够对数组进行切片并将切片传递给另一个需要 const slice_array 的函数。我知道我可以使用 operator[] 和一个切片从原始 valarray 中获取一个新的、复制的 valarray,但我想避免复制。一切都是常数,所以我觉得应该没问题。但是,valarray 的下标运算符的文档仅在应用于非常量 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 );
}

谢谢!

【问题讨论】:

    标签: c++ valarray


    【解决方案1】:

    如何在不产生副本的情况下获取 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; };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-29
      • 2019-12-14
      • 1970-01-01
      • 2010-11-24
      • 2010-10-31
      相关资源
      最近更新 更多