Большинство за введение using…
Напомнило фразу, которую мне сказал учитель, когда я ещё учился классе в 9. Я предлагал использовать динамический массив (пользователь должен ввести кол-во элементов), а учитель предложил/настоял на статическом массиве гигантских размеров. Если неэффективность процессорного времени можно стерпеть, то неправильное использование памяти - катастрофа!
Профит в том, что Вы копируете лишь ссылки на строки, а не сами строки. Ссылка занимает 4 байта, а строка - хоть 2 ГБ. Это и быстрее и экономичнее по памяти. Не исключено, что такой массив будет лежать в куче малых объектов и будет собран сборщиком мусора.
тут размер массивов можно изменять, в отличии от статичных. А учитель вам так сказал по из 2 причин
- эту тему ещё не учили
- учитель не может отпустить прошлый век
Но то что в вашем случае запас памяти был не оправдан - не значит что в данном так же.
Списки обновляются время от времени размер внутреннего массива, увеличивают если не хватает, потом можно вручную уменьшить/увеличить.
ссылка занимает столько бит - скольки-битная система, а не 32. И ваш случай ускоряет строки, но замедляет столбцы.
Что весит больше: ссылка на массив или сам массив?
Вы забываете про то что кроме ссылки на массив - в первом случае есть ещё и сам массив.
А ссылка+массив > массив.
А как без него?
Это уже тавтология. Ещё раз:
-
array of array
хранит 1 высоту, но кучу копий ширины матрицы. И + в нём ещё хранится по ссылке на каждую строчку. -
array[,]
хранит только 1 высоту и 1 ширину, и никаких ссылок. Поэтому на него надо меньше памяти.
Вы оправдываете использование array of array
память, хотя ваш пример даёт преимущество только в производительности, и ограничивает возможности (можно или быстро добавлять/удалять строки, или так же с столбцами, но не вместе).
Значит надо писать свой класс матрицы, помещая данные в неуправляемую память.
А вообще, известно, что всевозможный сахар замедляет код.
Много сообщений уже по теме, читал - и так не смог понять: ради чего все это затевается с матрицами? Из любви к искусству?
А так никто и не ответил… неужели и правда? Если матрицы надо обрабатывать плотные общего вида и “миллион на миллион” - да, понятно, надо писать свою библиотеку. Если матрицы огромные и специального вида - симметричные, ленточные, разреженные - там тоже понятно. Но это же не ваш случай?
Нет конечно. Простая задача. Есть динамическая матрица (или массив массивов, кто что больше любит), нужно удалить (добавить) строку (столбец) без использования дополнительных матриц (массивов) и желательно без переопределения памяти. С перевыделением новой памяти я уже написал в самом начале. И со статическими массивами я тоже знаю как это делается. Думал есть какие-то способы вроде List в одномерных массивах.
Задача реальная или она “просто есть”? Какие ограничения реальные на размеры матриц и их содержимое? Какая нужда заниматься экономией памяти?
Ну, List я вам привёл для матриц. Но он тоже не на магии работает - я сохранил те же константы что в стандартном List: изначальный размер=4, когда размера не хватает - умножить его на 2.
Та же, что и во времена Вашей молодости. Только масштабы другие.
Вот тут я бы хотел послушать первоисточник
Какой?
Задача то обычная для начинающих, наверное даже школьная. Посмотрел я видео по переподготовке учителей программирования. Там Михалкович говорит, что SetLength это плохо для массивов и лучше всего использовать List в таких случаях. Так для матриц то должно же быть что-то такое в таких же случаях, когда нужно их или расширять или уменьшать? Вот откуда вопрос пошел.
Благодарю, буду разбираться.