Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Зануление значений массива, по указателю 
V
    Опции темы
Rickert
Дата 29.10.2009, 05:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Допустим есть:
Код
unsigned char* c = new unsigned char[256]

Я как-то всегда занулял:
Код
memset(c, 0, 256);

Есть ли какие-то специальные функции для именно зануления? Желательно стандартные, а не присуще одной системе/компилятору.


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
586
Дата 29.10.2009, 06:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 10
Всего: 146



Код
#include <algorithm>

unsigned char* c = new unsigned char[256];
std::fill(c, c+256, 0);

PM   Вверх
586
Дата 29.10.2009, 07:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 10
Всего: 146



Цитата(Rickert @  29.10.2009,  05:49 Найти цитируемый пост)
Есть ли какие-то специальные функции для именно зануления?

Компу без разницы, занулять, или нет, и то, что в функцию memset передаётся параметр для зануления не значит, что алгоритм зануления плохой.
Функция memset основана на ассемблерной инструкции rep stosd. И не важно, что будет находиться в регистре eax - нуль или не нуль.
PM   Вверх
Earnest
Дата 29.10.2009, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



C другой стороны, неплохо помнить, что memset можно применять только к POD'ам, а std::fill к любым типам.


--------------------
...
PM   Вверх
UnrealMan
Дата 29.10.2009, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Обычно это делается гораздо проще:

Код
unsigned char* c = new unsigned char[256]();

Если обнулять массив нужно не сразу после выделения памяти, то тогда хорошо подходит std::fill_n.

Это сообщение отредактировал(а) UnrealMan - 29.10.2009, 15:42
PM MAIL   Вверх
bsa
Дата 29.10.2009, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



А еще лучше использовать std::vector<unsigned char>...
PM   Вверх
Rickert
Дата 30.10.2009, 02:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Цитата(Earnest @  29.10.2009,  08:09 Найти цитируемый пост)
C другой стороны, неплохо помнить, что memset можно применять только к POD'ам, а std::fill к любым типам. 

Что такое POD?


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
dumb
Дата 30.10.2009, 03:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 8
Всего: 158



Plain Old Data - по-русски говоря: простые типы, безо всякой "ООПщины".
PM MAIL   Вверх
Rickert
Дата 30.10.2009, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ситхи не пройдут!
****


Профиль
Группа: Комодератор
Сообщений: 3356
Регистрация: 11.7.2006
Где: Лакрима

Репутация: 0
Всего: 52



Всем спасибо!
solved smile 


--------------------
Ни что не внушает сна крепче, чем день приисполненный трудов!
PM MAIL WWW Skype GTalk   Вверх
Alexeis
Дата 30.10.2009, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



Цитата(586 @  29.10.2009,  06:11 Найти цитируемый пост)
Функция memset основана на ассемблерной инструкции rep stosd. 

  Не факт smile . Это отдельная частная реализация. Запросто может вызываться функция оськи ZeroMemory.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Любитель
Дата 30.10.2009, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Цитата(Alexeis @  30.10.2009,  10:21 Найти цитируемый пост)
Запросто может вызываться функция оськи ZeroMemory. 

Эээ..
Из WinBase.h:
Код

#define ZeroMemory RtlZeroMemory

Из WinNT.h:
Код

#define RtlZeroMemory(Destination,Length) memset((Destination),0,(Length))

Это не функция, это макрос smile


--------------------
PM MAIL ICQ Skype   Вверх
dumb
Дата 30.10.2009, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 8
Всего: 158



Цитата(Любитель @  30.10.2009,  11:44 Найти цитируемый пост)
Это не функция, это макрос
вообще говоря, такая функция присутствует и в kernel32.dll(в виде переходника) и в ntdll.dll. так что, если #define убрать(а в старых winnt.h он убирался какими-то #ifdef'ами), то будет вполне себе функция. smile
PM MAIL   Вверх
Любитель
Дата 30.10.2009, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Хм.. Не знал smile


--------------------
PM MAIL ICQ Skype   Вверх
Alexeis
Дата 30.10.2009, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



RtlZeroMemory в ntdll.dll
RtlZeroMemory в kernel32.dll

Чет, мне казалось, что оська должна эффективней решать такие задачи как копирование / зануление / перемещение 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
dumb
Дата 30.10.2009, 20:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 8
Всего: 158



Цитата(Alexeis @  30.10.2009,  19:13 Найти цитируемый пост)
мне казалось, что оська должна эффективней решать такие задачи как копирование / зануление / перемещение

это все слишком элементарные операции, чтобы уповать на ОС в отношении эффективности их выполнения.

в случае использования функций из .dll получается слишком накладно использовать лишние push/call/ret - по временной стоимости эти операции многократно превышают(при среднестатистическом кол-ве перемещаемых/копируемых эл-тов) стоимость тех трех-четырех инструкций, которые собственно всю работу и делают. поэтому в release варианте эти "рабочие" инструкции просто вкрячиваются по месту вызова(инлайнятся).
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1013 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.