![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Подозреваю, что об uninitialized_fill мало кто знает, поэтому и не используют. Все-таки это низкоуровневая функция. С другой стороны, она может быть удобна в случае "нестандартного" для С++ выделения памяти (malloc) - не нужно городить огород с размещающими new. Но я бы остерегся от использования этих нестандартных методов без крайней необходимости.
|
|||
|
||||
cutwater |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 592 Регистрация: 24.6.2008 Репутация: 1 Всего: 10 |
По поводу uninitialized_fill, могу высказать свое имхо
memset работать должен все таки быстрее |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
думаю, так и есть - в дебаге в релизе с оптимизацией с указателями должно быть то же самое хотя - кто знает (пробовать лень ![]() |
|||
|
||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 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. При следовании такому принципу (каждой задаче - соответствующий метод решения) по коду по крайней мере будет видно, какая задача решается.
|
|||
|
||||
MTWizard |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 51 Регистрация: 8.10.2007 Где: Київ Репутация: 3 Всего: 4 |
unitialized_fill - более общее решение, т.к. работает и для подов, и для не-подов.
Тем более, для типа signed/unsigned char unitialized_fill (по крайней мере в STLPort) превращается в memset Значит, эффективность она тоже обеспечивает. |
|||
|
||||
UnrealMan |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 722 Регистрация: 30.3.2006 Репутация: 27 Всего: 32 |
Изначальный пример выглядел так:
Если заменить здесь memset на std::uninitialized_fill, а после char заменить на не POD класс, то получишь двойное конструирование объекта в одной и той же области памяти. Затея смешивания относительно высокоуровневого new-expression с низкоуровневым конструированием объекта поверх памяти в качестве замены "смешиванию плюсового и сишного стиля" достойна похвал. Это сообщение отредактировал(а) UnrealMan - 22.8.2008, 00:27 |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
тогда моя ошибка я говорил не об этом примере, а вообще стоило создать новую тему... в общем, насколько я понял, в тех случаях когда надо, программисты используют memset вместо std::uninitialized_fill в основном потому, что о таком не знают. а в случае, если не менять memset на std::uninitialized_fill, а сразу менять чар на не ПОД класс? вроде тогда вообще ж... будет |
|||
|
||||
cutwater |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 592 Регистрация: 24.6.2008 Репутация: 1 Всего: 10 |
Обычно таких проблем не возникает. Они решаются на стадии проектирования, и там где нужен char - он нужен. Если в последствии приходится менять тип и замена memset на uninitialized_fill окажется трудоемкой, то проект хренов по определению.
Добавлено через 21 секунду Все вышесказанное опять же мое ИМХО |
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
А если структура объявленатак:
Как ее обнулить? Это сообщение отредактировал(а) Alca - 22.8.2008, 13:04 |
|||
|
||||
W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 20 Всего: 121 |
Alca, смотря как ты её создаёшь. Выше было приведено как минимум два характерных способа. Попробуй.
Это сообщение отредактировал(а) W4FhLF - 22.8.2008, 12:22 -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
Alek86 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
Alca, старайся не смешивать С и С++
что значит "обнулить" структуру? привести к дефолтному состоянию? тогда тебе поможет доюбавление в структуру функции Reinit(), которая будет вызываться также и в конструкторе. и структура потихоньку начнет превращаться в класс ![]() |
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
Обнулить (сорри за такие термины) - значит инициализировать выделяемую память '\0'.
Создаю так:
Надо через memset. Это сообщение отредактировал(а) Alca - 22.8.2008, 13:07 |
|||
|
||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
PHOSTENT - Это что? макрос? Что он определяет? Это указатель или структура? POD или не POD? Язык программирования Си или С++?
|
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
Плюсы.
Это сообщение отредактировал(а) Alca - 22.8.2008, 13:24 |
|||
|
||||
mrbrooks |
|
|||
![]() трололомен ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 4259 Регистрация: 4.10.2006 Где: Дол Гулдур Репутация: 2 Всего: 306 |
Я вообще предпочтаю обнулять все через макрос ZeroMemory(); в винде.
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |