Болталка PascalABC.NET


#816

Большинство за введение using…


#817

Напомнило фразу, которую мне сказал учитель, когда я ещё учился классе в 9. Я предлагал использовать динамический массив (пользователь должен ввести кол-во элементов), а учитель предложил/настоял на статическом массиве гигантских размеров. Если неэффективность процессорного времени можно стерпеть, то неправильное использование памяти - катастрофа!

Профит в том, что Вы копируете лишь ссылки на строки, а не сами строки. Ссылка занимает 4 байта, а строка - хоть 2 ГБ. Это и быстрее и экономичнее по памяти. Не исключено, что такой массив будет лежать в куче малых объектов и будет собран сборщиком мусора.


Помощь новичкам
#818

тут размер массивов можно изменять, в отличии от статичных. А учитель вам так сказал по из 2 причин

  • эту тему ещё не учили
  • учитель не может отпустить прошлый век

Но то что в вашем случае запас памяти был не оправдан - не значит что в данном так же.
Списки обновляются время от времени размер внутреннего массива, увеличивают если не хватает, потом можно вручную уменьшить/увеличить.

ссылка занимает столько бит - скольки-битная система, а не 32. И ваш случай ускоряет строки, но замедляет столбцы.


#819

Что весит больше: ссылка на массив или сам массив?


#820

Вы забываете про то что кроме ссылки на массив - в первом случае есть ещё и сам массив.
А ссылка+массив > массив.


#821

А как без него?


#822

Это уже тавтология. Ещё раз:

  • array of array хранит 1 высоту, но кучу копий ширины матрицы. И + в нём ещё хранится по ссылке на каждую строчку.
  • array[,] хранит только 1 высоту и 1 ширину, и никаких ссылок. Поэтому на него надо меньше памяти.

Вы оправдываете использование array of array память, хотя ваш пример даёт преимущество только в производительности, и ограничивает возможности (можно или быстро добавлять/удалять строки, или так же с столбцами, но не вместе).


#823

Значит надо писать свой класс матрицы, помещая данные в неуправляемую память.


#824

А вообще, известно, что всевозможный сахар замедляет код.


#825

Много сообщений уже по теме, читал - и так не смог понять: ради чего все это затевается с матрицами? Из любви к искусству?


#826

А так никто и не ответил… неужели и правда? Если матрицы надо обрабатывать плотные общего вида и “миллион на миллион” - да, понятно, надо писать свою библиотеку. Если матрицы огромные и специального вида - симметричные, ленточные, разреженные - там тоже понятно. Но это же не ваш случай?


#827

Нет конечно. Простая задача. Есть динамическая матрица (или массив массивов, кто что больше любит), нужно удалить (добавить) строку (столбец) без использования дополнительных матриц (массивов) и желательно без переопределения памяти. С перевыделением новой памяти я уже написал в самом начале. И со статическими массивами я тоже знаю как это делается. Думал есть какие-то способы вроде List в одномерных массивах.


#828

Задача реальная или она “просто есть”? Какие ограничения реальные на размеры матриц и их содержимое? Какая нужда заниматься экономией памяти?


#829

Ну, List я вам привёл для матриц. Но он тоже не на магии работает - я сохранил те же константы что в стандартном List: изначальный размер=4, когда размера не хватает - умножить его на 2.


#830

Та же, что и во времена Вашей молодости. Только масштабы другие.


#831

Вот тут я бы хотел послушать первоисточник


#832

Какой?


#833

Который @Bronislav

Это же с его подачи вопрос.


#834

Задача то обычная для начинающих, наверное даже школьная. Посмотрел я видео по переподготовке учителей программирования. Там Михалкович говорит, что SetLength это плохо для массивов и лучше всего использовать List в таких случаях. Так для матриц то должно же быть что-то такое в таких же случаях, когда нужно их или расширять или уменьшать? Вот откуда вопрос пошел.


#835

Благодарю, буду разбираться.