Re[7]: Общий случай
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 23.11.18 09:44
Оценка:
Здравствуйте, Qbit86, Вы писали:

I>>А библиотека, которая требует массив, принимает всего один параметр — массив, — и ничего не знает про лишние ячейки. Твои действия ?


Q>С такими библиотеками никогда не сталкивался. Если столкнулся бы с API, что не позволяет передать часть массива — сделал бы копию.


И для чего тогда этот кульный метод, если надо самому делать копию?

I>>Это работает в частном случае, когда ты сам пишешь код и никуда не передаешь этот массив. Обычно все ровно наоборот — массивы нужны для взаимодейсвтия с низкоуровневым API.

Q>И этот низкоуровневый API обычно принимает (start, count).

Это далеко не факт. Часто надо подготовить буфер определенной длины и заполнить его различными данными. И совсем необязательно данные идут из одного источника.

I>>Я говорю про приемник этого массива. Откуда гарантия, что этот приемник съест лишние ячейки ?

Q>А откуда ты обычно черпаешь гарантию, что API сделает то, о чём заявляет в документации?

Полагаю, ты имеешь ввиду гарантии вида: "передавайте любого размера массив, мы сами догадаемся, где там нужное, а где не нужное".
Ни разу не видел такого. Обычно или голый массив, и сразу фейл, или, что реже, массив, стартовая позиция и количество.

Q>>>Да бог с ним с ресайзом на месте. Даже если он был бы, у текущего Листа всё равно нельзя отнять буфер — хоть с «лишними» ячейками, хоть без.

I>>Разумеется. Кому нужна поддержка двух частных случаев ?

Q>И как твой ресайз позволит избавиться от лишней аллокации массива при попытке получить массив из Листа?


Элементрно. Мне нуже буфер размера 100. Капсити — 128. Вместо создания нового экземпляра и копирования вручную, я просто сообщаю желаемый размер и фремворк обрезает массив до 100 элементов.

I>>Ты предлагаешь решение для какогото частного случая или двух, до кучи крайне неэффективное.

Q>Я не знаю, какой «общий случай» ты имеешь в виду, и каким образом он эффективнее простой передачи владения существующим массивом вместо создания нового массива-дубликата.

Твой кейс не подразумевает простой передачи владения и ты сам же предлагаешь копировать вручную. Просто потому что капасити будет всегда не того размера, что нужно вызываемому код. Т.е. всегда придется заниматься копированием вручную. Следовательно, это равносильно toArray()
И нахрена тогда твой метод?
Re[8]: Общий случай
От: Qbit86 Кипр
Дата: 23.11.18 10:03
Оценка:
Здравствуйте, Ikemefula, Вы писали:

Q>>С такими библиотеками никогда не сталкивался. Если столкнулся бы с API, что не позволяет передать часть массива — сделал бы копию.

I>И для чего тогда этот кульный метод, если надо самому делать копию?

Для работы с теми API, которые таки принимают фрагмент массива (с другими я не сталкивался). Тогда делать копию не нужно.

Q>>И этот низкоуровневый API обычно принимает (start, count).

I>Это далеко не факт. Часто надо подготовить буфер определенной длины и заполнить его различными данными.

Давай примеры из BCL? Интересует пример API, котоый принимает на вход буфер, но не предоставляет перегрузку, принимающую (offset, count) или (start, length).

Q>>И как твой ресайз позволит избавиться от лишней аллокации массива при попытке получить массив из Листа?

I>Элементрно. Мне нуже буфер размера 100. Капсити — 128. Вместо создания нового экземпляра и копирования вручную, я просто сообщаю желаемый размер и фремворк обрезает массив до 100 элементов.

В моём примере не надо ничего копировать или аллоцировать:
string[] array = list.MoveToArray();
return string.Join(", ", array, 1, 3);

Приведи аналогичный код, считая, что у тебя есть API для ресайза массива. Вот обрезал ты у листа внутренний недоступный тебе буфер. Как ты извлечёшь его для передачи в API, который принимает массив, а не лист?

I>Твой кейс не подразумевает простой передачи владения и ты сам же предлагаешь копировать вручную.


Нет. Я не предлагаю копировать вручную.

I>Просто потому что капасити будет всегда не того размера, что нужно вызываемому код. Т.е. всегда придется заниматься копированием вручную.


Нет. Копировать возможно придётся только в тех редких случаях, если API не предоставляет перегрузки с (offset, count) или (start, length). Но я с такими случаями в стандартной библиотеке не сталкивался, а ты их не приводишь.
Глаза у меня добрые, но рубашка — смирительная!
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.