| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Зануление значений массива |
| Автор: Rickert 29.10.2009, 05:49 | ||||
Допустим есть:
Я как-то всегда занулял:
Есть ли какие-то специальные функции для именно зануления? Желательно стандартные, а не присуще одной системе/компилятору. |
| Автор: 586 29.10.2009, 06:55 | ||
|
| Автор: 586 29.10.2009, 07:11 |
Компу без разницы, занулять, или нет, и то, что в функцию memset передаётся параметр для зануления не значит, что алгоритм зануления плохой. Функция memset основана на ассемблерной инструкции rep stosd. И не важно, что будет находиться в регистре eax - нуль или не нуль. |
| Автор: Earnest 29.10.2009, 08:09 |
| C другой стороны, неплохо помнить, что memset можно применять только к POD'ам, а std::fill к любым типам. |
| Автор: UnrealMan 29.10.2009, 15:21 | ||
Обычно это делается гораздо проще:
Если обнулять массив нужно не сразу после выделения памяти, то тогда хорошо подходит std::fill_n. |
| Автор: bsa 29.10.2009, 16:13 |
| А еще лучше использовать std::vector<unsigned char>... |
| Автор: Rickert 30.10.2009, 02:10 | ||
Что такое POD? |
| Автор: dumb 30.10.2009, 03:39 |
| Plain Old Data - по-русски говоря: простые типы, безо всякой "ООПщины". |
| Автор: Rickert 30.10.2009, 08:08 |
| Всем спасибо! solved |
| Автор: Alexeis 30.10.2009, 10:21 |
Не факт |
| Автор: Любитель 30.10.2009, 11:44 | ||||
Эээ.. Из WinBase.h:
Из WinNT.h:
Это не функция, это макрос |
| Автор: dumb 30.10.2009, 18:47 |
| вообще говоря, такая функция присутствует и в kernel32.dll(в виде переходника) и в ntdll.dll. так что, если #define убрать(а в старых winnt.h он убирался какими-то #ifdef'ами), то будет вполне себе функция. |
| Автор: Любитель 30.10.2009, 19:01 |
| Хм.. Не знал |
| Автор: Alexeis 30.10.2009, 19:13 |
| RtlZeroMemory в ntdll.dll RtlZeroMemory в kernel32.dll Чет, мне казалось, что оська должна эффективней решать такие задачи как копирование / зануление / перемещение |
| Автор: Alexeis 30.10.2009, 21:11 | ||
А вдруг кой чего может делаться аппаратно? Ведь x86 это не единственная платформа. При работе с графикой блоки могут быть больше мегабайта. Например контроллер DMA может кой чего делать и без процессора. Пока DMA будет выполнять операции с памятью, процессор может заняться вычислениями соседнего потока. Вот как стереть кадр не зануляя? Или же инициализировать массив POD типа большой длинны? Я видел реализации копирования памяти при помощи mmx регистров которые быстрее стандартных, аналогично можно себе представить здоровенный регистр SSE на 256 бит, который за один такт зануляет сразу 8 двойных слов. Это может получиться в разы быстрее. ОС знает архитектуру процессора, она может такие операции сделать гораздо быстрее и с меньшей нагрузкой на железо. |
| Автор: Любитель 30.10.2009, 22:39 |
| Теоретически компилятор знает целевую архитектуру |