![]() |
|
Модераторы: bsa |
![]()
|
|
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
Мне кажется сложновато. Я вообще-то сам не особый знаток шаблонов и хороший шаблонный класс быстро не напишу. А вообще мысль достаточно интересная - вот где синтаксис поизучать можно. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Дело в том, что сишний 2х мерный динамический массив - это гораздо больше, чем просто 2х-мерный массив. Такой подход позволяет каждой "строке" массива иметь свою длину. Или просто рассматривать строку, как самостоятельный массив. Но ничто не мешает использовать одномерный массив как псевдо-двухмерный и такой подход также имеет право на жизнь, но теряется рад преимуществ. Так что все зависит от задачи и использование слова "бред" в том контексте считаю необоснованным. Это сообщение отредактировал(а) mes - 3.3.2009, 16:55 |
|||
|
||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
||||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 6 Всего: 26 |
это уже чтото похожее на дерево (скоре куст), но массивом я бы это не назвал кроме того в 1м посте ТС написал что ему нужна прямоугольная матрица, а не непоймичто со строками разной длины, неэффективным использованием памяти и большим временем доступа и обхода алсо при небольших размерах матрицы такие задачи решаются использованием статической матрицы максимального размера Добавлено через 3 минуты и 1 секунду ...так что в контексте ЭТОЙ задачи, динамический одномерный массив динамических одномерных массивов это бред. Это сообщение отредактировал(а) GoldFinch - 3.3.2009, 17:18 |
|||
|
||||
| Gunslinger |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 842 Регистрация: 30.12.2006 Где: Астрахань Репутация: нет Всего: 3 |
прочитал еще до того, как тему запостил. затем перечитал. Разжевано, да. Но... привычка! Сейчас делаю по старинке - на неделе будет время, почитаю про векторы, перепишу с ними. |
|||
|
||||
| mes |
|
||||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Интересно откуда такие подробные сведения о задаче ? Мне личного встретившегося в тексте описания не хватило, чтоб сделать такое однозначное заключение.
Но не сказано для чего она будет использована.
Будем экономить до каждого такта или может в большинстве случаев достаточно просто не злоупотреблять ?!
о! a как же в этом случае поступим с неэффективным использованием памяти ?!
Вы дважды употребили это слово по отношению к обсуждаемому предмету. Т.е. Вы утверждаетеи абсолютно, что недостатки от выбора этого метода значительно превышают преимущества такого подхода?! Или Вам просто нравится голословно (да именно голословно, так как ни одного стоящего факта Вы не привели, подтверждающего именно бредовасть обсуждаеммого подхода) привлекать внимание к своим постам и разводить оффтопик ?! |
||||||||
|
|||||||||
| Anikmar |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
Автор топика попросил рассказать как создать 2-х мерный массив - так как одномерный у него получился. Таким образом он не просил рассказать как работать с одномерным массивом эмулируя двухмерный, а просил показать именно как создать динамически нормальный двухмерный массив. Пример с квадратной матрицей оставил сознательно, чтобы человек попробовал сам модифицировать пример
Вопрос о неэффективном использовании памяти весьма спорный, при большом размере массива гораздо больше вероятности отсутствия непрерывного блока в памяти, чем при выделении нескольких блоков - отсюда пойдет дополнительный своп. Большее время доступа - уже неоднократно сравнивались два подхода, скорость доступа по указателю с использования только сложения без применения умножения выше. Данный подход к созданию динамических массивов описан в литературе по С++, следовательно авторы типа Страуструпа и Лафоре - лохи, и не знаю, что бредят. Они во время не проконсультировались у GoldFinch, поэтому понаписали всякой бредятины и еще молодежь этому учат. Если необходимо в процессе работы многократно создавать небольшие двухмерные массивы - то применять лучше одномерный - меньше будут потери на выделение памяти. Если требуется достаточно большие вычисления внутри одного массива, а также работа с тремя и выше размерностями - то лучше применять общий случай с указателями. Если GoldFinch очень любит слово "бред" я не смею ему препятствовать - у каждого свои пристрастия и чувства другого следует уважать. |
||||||
|
|||||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
GoldFinch
У каждого свои пристрастия, и у каждой задачи свои решения. В некоторых случаях удобнее использовать динамические, в некоторых статические. Я писал программы для устройства с процессором 70 мегагерц и памятью несколько мегабайт причем на ней еще был загружен юникс. И за каждый лишний байт надо было отвечать по всей строгости закона. А бывали задачки когда смена деления на 2 в цикле на битовое смещение снизило время работы программы с трех до одной секунды. Давайте не будем так однозначно судить о возможностях С/С++ и называть это бредом. Если в известных книгах не написано - Матрицы это бред!! значит это не так, поверь что те люди которые их пишут немного глубже тебя и меня изучили предметную область Это сообщение отредактировал(а) azesmcar - 3.3.2009, 18:37 |
|||
|
||||
| Anikmar |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
Этот спор мы уже проходили, на самом деле.
Откопал свой тест. Итак имеем 2 массива размерностью 10000х10000. Один создаем как правильно и работаем стандартно, второй создаем тоже правильно, но вычисляем индексы динамически. Сразу присекаю споры - что динамически там не нужно, можно оптимизировать и т.п. Я сейчас о другом. Gunslinger назвал мой пример редкостным бредом, а также утверждал, что динамический подсчет индексов ведет к уменьшению объема занимаемой памяти и увеличению скорости доступа Итак мой код:
По поводу неэффективного использования памяти - тут очевидно, в варианте динамического создания тратится 40000 байт на хранение указателей (считая 4 байта на указатель) либо +- в зависимости от системы. Что выдала программа при запуске: Create On Pointers = 406 Create solid = 16 Fill pointers = 1000 Fill solid = 20891 Резюме: На создание такого массива тратится на 40 Кб больше памяти и 400 тиков дольше. Однако, при доступе к элементам динамическое вычисление оказывается в 20 раз медленнее чем стандартное (в смысле как рекомендуют авторы языка). Повторю свой подход: Эту цитату:
я рассматриваю как пустую - мы обсуждали динамические массивы согласно теме. |
||||
|
|||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Не того обвиняете, это был не Gunslinger. Это сообщение отредактировал(а) mes - 3.3.2009, 19:00 |
|||
|
||||
| GoldFinch |
|
||||||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 6 Всего: 26 |
это говорит только о том что кодогенератор\оптимизатор плох
еще в литературе приводят примеры вычисления факториала через рекурсию, хотя факториал никто так не считает, если подход возможен и описан не значит что его можно сразу же бездумно применять Вероятности отсутствия непрерывного блока в памяти - это понятие умерло еще когда от 1Мб адресного пространства перешли к 4Гб. Сейчас блоки памяти есть всегда, но вот эта память может оказаться в разных местах, и чем больше число кусков памяти и их суммарный размер, тем больше вероятность что память окажется не в кеше\не в ОЗУ, и тем дольше память процесса будет извлекаться из свопа когда она там окажется. Кроме того, чем больше в хипе маленьких блочков памяти тем более фрагментирован хип, и т.п. и т.д.
если нужен быстрый доступ к строкам - сделайте отдельный массив указателей на каждую строку в одномерном массиве так чем же хорошо использование массива динамических массивов для создания прямоугольной матрицы, размеры которой после создания меняться не будут? |
||||||
|
|||||||
| Anikmar |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2513 Регистрация: 26.11.2006 Где: Санкт-Петербург Репутация: 5 Всего: 59 |
||||
|
||||
| GoldFinch |
|
||||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 6 Всего: 26 |
Anikmar,
замени на
Добавлено через 3 минуты и 20 секунд и время у тебя меряется крайне не точно, может ты переключение потоков поймал, вот у тебя и получилась в 20 раз разница |
||||
|
|||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Зачем мудрить и выдумывать когда есть удобное средство.
тем что является стандартным средством и в большинстве случаев не имеет недостатков перед другими подходами. А вот использование неоднократного открытого расчета (типа a[y*size+x]) имеет ряд скрытых и опасных недостатков. Добавлено @ 19:23 Ну это шарлатанство.. такой трюк(линиализировать матричность) можно использовать только в ограниченном числе задач. Хотя я не спорю, что для почередного доступа к элементам первый пример можно оптимизировать и тогда разницы в скорости не будет. Но вот при рандомном доступе с оптимизацией будет трудней - хотя все это в принципе решающего значения не имеет. Это сообщение отредактировал(а) mes - 3.3.2009, 19:29 |
||||
|
|||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 6 Всего: 26 |
mes, это не шарлатанство, а нормальное решение, ты же std::vector итератором обходишь, а не [] юзаешь
там кстате "итератор" лучше конечно будет,
оберни его во чтонибудь приятное, в дефайн оборачивать те наверное религия не позволит, но мало ли в С++ средств |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |