![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Royan |
|
|||
Dreamer ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 14.9.2002 Где: Лондон Репутация: нет Всего: 15 |
Допустим есть такой код
Надежно ли обнулять память массива таким образом? Могут ли быть какие-то побочные эффекты. Меня интересуют 32 и 64 битные платформы, используя g++, gcc, icl, cl(msvc). Насколько я знаю на cl особых проблем нет, но все-таки хочется знать точку зрения профессионала -------------------- Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Royan,
нет таким образом нельзя вообще! Получишь утечку памяти. У тебя же двухмерный массив! Вот если бы это был обычный массив POD типа, то использование memset вполне легально и надежно. Но в твоём случае это преступление. Откуда ты решил что так можно писать? Это сообщение отредактировал(а) Daevaorn - 25.2.2006, 10:56 |
|||
|
||||
MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
если тебе надо занулить все строки матрицы пиши
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
Royan |
|
|||
Dreamer ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 14.9.2002 Где: Лондон Репутация: нет Всего: 15 |
MAKCim, Так не могу очень долго. Массив используется в части, где время критично, поэтому необходимо его очень быстро обнулять к тому же твоим способом я тоже получу утечку, а чтобы этого не случилось, придется еще его и удалять.
Daevaorn, Мне казалось, что в любом массиве элементы располагаются друг за другом. А можешь объяснить, в чем отличие динамического массива от статического с физической точки зрения, откуда там возникает утечка? -------------------- Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь |
|||
|
||||
MAKCim |
|
||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
что значит долго? Обнуляется каждая строка в процессе создания
А в твоем примере нет утечки? Сделай класс, в деструкторе удаление...
в статическом не может быть утечки, т. к размещается в стеке (память автоматически освобождается), память для дин. массива выделяется в куче (ответственность за удаление на пользователе) -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||
|
|||||||
Fin |
|
||||||||||||
![]() Дракон->Спать(); ![]() ![]() Профиль Группа: Участник Сообщений: 687 Регистрация: 4.1.2006 Репутация: 3 Всего: 10 |
В двухмерном массиве, созданом не динамически, члены массива идут один за другим. Пример:
Вот вырезка, как этот массив разместился у меня в памяти:
Теперь расмотрим динамический массив. В первую размерность записываются не данные, а адреса на вторую размерность. Во второй размерности уже записываются сами данные. Пример:
После выполнения в самой переменной ch был записан адрес на выделенную память.
Это так выгледела первая размерность. Так выгледит вторая размерность
Если ты даеш memset для двухмерного динамического массива в твоем случае, то ты просто напросто затираеш ссылки на вторую размерность. И последуюшие попытки обрашения ко второй размерности должны привести к вылету программы. Добавлено @ 18:48 Если ты хочеш обнулять вторую размерность, нужно делать
Это сообщение отредактировал(а) Fin - 25.2.2006, 18:42 -------------------- Пролетал мимо. |
||||||||||||
|
|||||||||||||
Royan |
|
|||
Dreamer ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 14.9.2002 Где: Лондон Репутация: нет Всего: 15 |
MAKCim, Дело в том, что создание/удаление элементов априорно медленнее, чем простая запись нулей. Хотя бы, поэтому для меня предложенный тобой вариант не годится. Статический массив мне не подойдет, у меня там алгоритм работы на динамике построен.
Fin, +1 Теперь все кристально ясно. Честное слово я бы проставился за такой ответ ;) Это надо пометить в F.A.Q! Но вопрос о наиболее оптимальном способе обнуления я бы закрывать не хотел. Несомненно, вариант, предложенный Fin, значительно лучше, чем просто присвоение каждому элементу массива нуля, но может кто-то знает еще более изящный способ? -------------------- Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь |
|||
|
||||
Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Изящнее не существует. Добавление "()" к твоему коду - это предел изящности |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
можно сделать одномерный массив A размером M*N
и к нему еще сделать доп. массив указателей на начала строк B[i]=A+RowLength*i тогда и создавать, и удалять нужно будет с помощью одного new и одного delete а это, как мне кажется, и будут основные затраты при создании/удалении а для обнуления можно будет использовать тот факт, что все элементы идут друг за другом и вызывать memset для A... -------------------- qqq |
|||
|
||||
MAKCim |
|
||||||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
и у тебя и у меня идет создание double-ов
выражение
обнуляет каждый double чем эта запись медленнее memset, и каким образом устроен memset в таком случае получается, что
медленнее чем
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||||||
|
|||||||||||
Royan |
|
|||
Dreamer ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 14.9.2002 Где: Лондон Репутация: нет Всего: 15 |
MAKCim, У меня создание массива только в оном месте, далее могут произойти десятки тысяч обнулений. Просто в примере эти опреации я написал друг за другом.
-------------------- Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь |
|||
|
||||
ДобренькийПапаша |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 14.1.2006 Где: г.Москва Репутация: нет Всего: 7 |
for(i=0; i<n; i++)
{ for(j=0;j<n;j++) a[i][j]=0; } А что, так нельзя? -------------------- Меня зовут Себастьян Парейра, торговец чёрным деревом. |
|||
|
||||
YonasBriginas |
|
|||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 25.2.2006 Репутация: нет Всего: нет |
можно только цикл ускорить, а с памятью самое оптимальное решение было предложено.
|
|||
|
||||
Royan |
|
|||
Dreamer ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 14.9.2002 Где: Лондон Репутация: нет Всего: 15 |
maxim1000, Только сейчас понял твою мысль
![]()
2YonasBriginas, Спасибо за внимательность ![]() -------------------- Открыта вакансия Junior Java Developer'а в нашем лондонском офисе, подробнее можно узнать здесь |
|||
|
||||
MAKCim |
|
||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
тогда ладно, хотя memset тоже скорее всего на циклах основана я думаю что-то типа
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |