Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Надежно ли обнулять массив с помощью memset()? |
Автор: Royan 25.2.2006, 07:42 | ||
Допустим есть такой код
Надежно ли обнулять память массива таким образом? Могут ли быть какие-то побочные эффекты. Меня интересуют 32 и 64 битные платформы, используя g++, gcc, icl, cl(msvc). Насколько я знаю на cl особых проблем нет, но все-таки хочется знать точку зрения профессионала |
Автор: Daevaorn 25.2.2006, 10:43 |
Royan, нет таким образом нельзя вообще! Получишь утечку памяти. У тебя же двухмерный массив! Вот если бы это был обычный массив POD типа, то использование memset вполне легально и надежно. Но в твоём случае это преступление. Откуда ты решил что так можно писать? |
Автор: MAKCim 25.2.2006, 15:12 | ||
если тебе надо занулить все строки матрицы пиши
|
Автор: Royan 25.2.2006, 17:56 |
MAKCim, Так не могу очень долго. Массив используется в части, где время критично, поэтому необходимо его очень быстро обнулять к тому же твоим способом я тоже получу утечку, а чтобы этого не случилось, придется еще его и удалять. Daevaorn, Мне казалось, что в любом массиве элементы располагаются друг за другом. А можешь объяснить, в чем отличие динамического массива от статического с физической точки зрения, откуда там возникает утечка? |
Автор: MAKCim 25.2.2006, 18:36 | ||||||
что значит долго? Обнуляется каждая строка в процессе создания
А в твоем примере нет утечки? Сделай класс, в деструкторе удаление...
в статическом не может быть утечки, т. к размещается в стеке (память автоматически освобождается), память для дин. массива выделяется в куче (ответственность за удаление на пользователе) |
Автор: Royan 25.2.2006, 19:16 |
MAKCim, Дело в том, что создание/удаление элементов априорно медленнее, чем простая запись нулей. Хотя бы, поэтому для меня предложенный тобой вариант не годится. Статический массив мне не подойдет, у меня там алгоритм работы на динамике построен. Fin, +1 Теперь все кристально ясно. Честное слово я бы проставился за такой ответ ;) Это надо пометить в F.A.Q! Но вопрос о наиболее оптимальном способе обнуления я бы закрывать не хотел. Несомненно, вариант, предложенный Fin, значительно лучше, чем просто присвоение каждому элементу массива нуля, но может кто-то знает еще более изящный способ? |
Автор: Daevaorn 25.2.2006, 19:24 | ||
Изящнее не существует. Добавление "()" к твоему коду - это предел изящности |
Автор: maxim1000 25.2.2006, 20:20 |
можно сделать одномерный массив A размером M*N и к нему еще сделать доп. массив указателей на начала строк B[i]=A+RowLength*i тогда и создавать, и удалять нужно будет с помощью одного new и одного delete а это, как мне кажется, и будут основные затраты при создании/удалении а для обнуления можно будет использовать тот факт, что все элементы идут друг за другом и вызывать memset для A... |
Автор: MAKCim 25.2.2006, 20:30 | ||||||||||
и у тебя и у меня идет создание double-ов
выражение
обнуляет каждый double чем эта запись медленнее memset, и каким образом устроен memset в таком случае получается, что
медленнее чем
|
Автор: Royan 25.2.2006, 22:17 |
MAKCim, У меня создание массива только в оном месте, далее могут произойти десятки тысяч обнулений. Просто в примере эти опреации я написал друг за другом. |
Автор: ДобренькийПапаша 25.2.2006, 22:25 |
for(i=0; i<n; i++) { for(j=0;j<n;j++) a[i][j]=0; } А что, так нельзя? |
Автор: YonasBriginas 26.2.2006, 01:09 | ||
можно только цикл ускорить, а с памятью самое оптимальное решение было предложено.
|
Автор: Royan 26.2.2006, 05:15 | ||
maxim1000, Только сейчас понял твою мысль ![]()
2YonasBriginas, Спасибо за внимательность ![]() |
Автор: MAKCim 26.2.2006, 10:08 | ||||
тогда ладно, хотя memset тоже скорее всего на циклах основана я думаю что-то типа
|
Автор: maxim1000 26.2.2006, 13:37 | ||
да... тогда обнуление - просто
|
Автор: YonasBriginas 26.2.2006, 16:18 |
2Royan, да. для фундаментальных типов компилятор может устранить дополнительную копию. но лучше не надеятся на него. ![]() |