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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Заполнить выделенную динамическую память нулями 
:(
    Опции темы
bsa
Дата 21.8.2008, 21:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Подозреваю, что об uninitialized_fill мало кто знает, поэтому и не используют. Все-таки это низкоуровневая функция. С другой стороны, она может быть удобна в случае "нестандартного" для С++ выделения памяти (malloc) - не нужно городить огород с размещающими new. Но я бы остерегся от использования этих нестандартных методов без крайней необходимости.
PM   Вверх
cutwater
Дата 21.8.2008, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



По поводу uninitialized_fill, могу высказать свое имхо
memset работать должен все таки быстрее


--------------------
user posted image
PM MAIL   Вверх
Alek86
Дата 21.8.2008, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 21
Всего: 25



Цитата(cutwater @  21.8.2008,  21:53 Найти цитируемый пост)
memset работать должен все таки быстрее

думаю, так и есть - в дебаге
в релизе с оптимизацией с указателями должно быть то же самое
хотя - кто знает (пробовать лень smile )


--------------------
user posted image    user posted image
PM MAIL   Вверх
UnrealMan
Дата 21.8.2008, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Создание массива из n объектов определённого типа и выделение n байт сырой памяти - это разные задачи, и у каждой будет своё наиболее подходящее (хотя бы с точки зрения самодокументируемости кода) решение. В первом случае подходящим решением будет использвание new-expression, std::vector или иного контейнера, если первые два не подходят. Во втором случае подходящим решением будет явный вызов operator new. В первом случае при использовании new-expression для заполнения массива n элементами подходящим средством будет std::fill_n. Во втором случае для размещения n объектов в сырой памяти подходящим средством будет std::uninitialized_fill_n. При следовании такому принципу (каждой задаче - соответствующий метод решения) по коду по крайней мере будет видно, какая задача решается.
PM MAIL   Вверх
MTWizard
Дата 21.8.2008, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 51
Регистрация: 8.10.2007
Где: Київ

Репутация: 3
Всего: 4



unitialized_fill - более общее решение, т.к. работает и для подов, и для не-подов.

Тем более, для типа signed/unsigned char unitialized_fill (по крайней мере в STLPort) превращается в memset
Значит, эффективность она тоже обеспечивает.

PM MAIL   Вверх
UnrealMan
Дата 22.8.2008, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Alek86 @  21.8.2008,  22:25 Найти цитируемый пост)
насколько я вижу в примерной реализации std::uninitialized_fill там вообще не идет речи ни о ПОД ни о каком-то конкретном куске памяти. есть только 2 итератора и значения. что ты имел в виду, когда писал о ПОД?

Изначальный пример выглядел так:

Код

char *pszText  = new char[2048];
memset(pszText, '\0', 2048);

Если заменить здесь memset на std::uninitialized_fill, а после char заменить на не POD класс, то получишь двойное конструирование объекта в одной и той же области памяти. Затея смешивания относительно высокоуровневого new-expression с низкоуровневым конструированием объекта поверх памяти в качестве замены "смешиванию плюсового и сишного стиля" достойна похвал.

Это сообщение отредактировал(а) UnrealMan - 22.8.2008, 00:27
PM MAIL   Вверх
Alek86
Дата 22.8.2008, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 21
Всего: 25



Цитата(UnrealMan @  22.8.2008,  00:25 Найти цитируемый пост)
Изначальный пример выглядел так

тогда моя ошибка
я говорил не об этом примере, а вообще
стоило создать новую тему...


в общем, насколько я понял, в тех случаях когда надо, программисты используют memset вместо std::uninitialized_fill в основном потому, что о таком не знают.

Цитата(UnrealMan @  22.8.2008,  00:25 Найти цитируемый пост)
Если заменить здесь memset на std::uninitialized_fill, а после char заменить на не POD класс, то получишь двойное конструирование объекта в одной и той же области памяти.

а в случае, если не менять memset на std::uninitialized_fill, а сразу менять чар на не ПОД класс?
вроде тогда вообще ж... будет


--------------------
user posted image    user posted image
PM MAIL   Вверх
cutwater
Дата 22.8.2008, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Обычно таких проблем не возникает. Они решаются на стадии проектирования, и там где нужен char - он нужен. Если в последствии приходится менять тип и замена memset на uninitialized_fill окажется трудоемкой, то проект хренов по определению.

Добавлено через 21 секунду
Все вышесказанное опять же мое ИМХО


--------------------
user posted image
PM MAIL   Вверх
Alca
Дата 22.8.2008, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 7
Всего: 50



А если структура объявленатак:
Код

typedef struct {
    //объявление членов;
} *Pимя_структуры;    //<-- указатель

Как ее обнулить?

Это сообщение отредактировал(а) Alca - 22.8.2008, 13:04


--------------------
PM WWW ICQ Skype Jabber   Вверх
W4FhLF
Дата 22.8.2008, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

Репутация: 20
Всего: 121



Alca, смотря как ты её создаёшь. Выше было приведено как минимум два характерных способа. Попробуй. 

Это сообщение отредактировал(а) W4FhLF - 22.8.2008, 12:22


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Alek86
Дата 22.8.2008, 12:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 21
Всего: 25



Alca, старайся не смешивать С и С++
что значит "обнулить" структуру?
привести к дефолтному состоянию?

тогда тебе поможет доюбавление в структуру функции Reinit(), которая будет вызываться также и в конструкторе.

и структура потихоньку начнет превращаться в класс smile


--------------------
user posted image    user posted image
PM MAIL   Вверх
Alca
Дата 22.8.2008, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 7
Всего: 50



Обнулить (сорри за такие термины) - значит инициализировать выделяемую память '\0'.
Создаю так:
Код

PHOSTENT  pHost;  // pHost - указатель

Надо через memset.

Это сообщение отредактировал(а) Alca - 22.8.2008, 13:07


--------------------
PM WWW ICQ Skype Jabber   Вверх
bsa
Дата 22.8.2008, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



PHOSTENT - Это что? макрос? Что он определяет? Это указатель или структура? POD или не POD? Язык программирования Си или С++?
PM   Вверх
Alca
Дата 22.8.2008, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 7
Всего: 50



Плюсы.
Код

//winsock2.h
struct  hostent {
        char    FAR * h_name;           /* official name of host */
        char    FAR * FAR * h_aliases;  /* alias list */
        short   h_addrtype;             /* host address type */
        short   h_length;               /* length of address */
        char    FAR * FAR * h_addr_list; /* list of addresses */
#define h_addr  h_addr_list[0]          /* address, for backward compat */
};
typedef struct hostent *PHOSTENT;


Это сообщение отредактировал(а) Alca - 22.8.2008, 13:24


--------------------
PM WWW ICQ Skype Jabber   Вверх
mrbrooks
Дата 22.8.2008, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


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

Репутация: 2
Всего: 306



Я вообще предпочтаю обнулять все через макрос ZeroMemory(); в винде.
PM MAIL   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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