Могу ли я получить const slice_array от const valarray?
У меня есть функция, которая принимает константную ссылку на valarray, и я хочу иметь возможность разрезать массив и передать срез в другую функцию, которая ожидает const slice_array. Я знаю, что могу просто использовать operator[] и фрагмент, чтобы получить новый скопированный valarray из исходного valarray, но я хочу избежать копирования. Все константно, так что я чувствую, что все должно быть в порядке. Тем не менее, документация для оператора нижнего индекса только для valarray возвращает объекты slice_array при применении к неконстантным valarrays. Это кажется своего рода серьезным недостатком в классе 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 );
}
Спасибо!
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; };