Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Для новичков > Расширение динамического массива |
Автор: Neytral 6.9.2007, 21:01 | ||||
Интересует задача создания функции расширяющей динамический массив (функция должна вызываться последовательно несколько раз, т.е. к примеру расширить массив от 0 до 99999 шагом 1), передаваемый ей через список параметров. Собственно это первый пример, который к сожалению выдаёт ошибку.
Тот же пример, только без функции - всё работает замечательно!
У меня Visual C++ 6.0, ставил сервиспаки 1, 2, 4, 5 (ставил все по порядку). |
Автор: bsa 6.9.2007, 21:15 | ||
А лучше это делать через realloc. Хоть и сишная функция, зато меньше гимору. |
Автор: JackYF 6.9.2007, 21:53 |
имхо, лучше это делать через std::vector - это его штатное поведение, - (причем он будет вести себя в этом случае оптимальнее, чем реаллок и такая самописная функция) и не изобретать велосипед. |
Автор: bsa 7.9.2007, 10:48 | ||
логично, и как я сам про него забыл... ![]() |
Автор: Neytral 7.9.2007, 23:44 |
Спасибо, по ссылке заработало, пошел изучать realloc. |
Автор: bsa 7.9.2007, 23:53 | ||
ты еще и про std::vector почитай. Может он тебе лучше подойдет. |
Автор: UnrealMan 8.9.2007, 16:51 |
Оптимальнее по скорости в случае POD-типов - это вряд ли. |
Автор: JackYF 8.9.2007, 21:35 |
я про другое. Если я последовательно увеличиваю размер массива от 1 до N, то реаллок сделает N перевыделений памяти, а вектор - около log2(N). Так что не согласен. |
Автор: JackYF 9.9.2007, 23:22 | ||
а что делается в примере кода выше?
А std::vector - наверняка еще меньше, причем прозрачно для тебя. |
Автор: UnrealMan 9.9.2007, 23:43 | ||
Да какая разница? Может, ты скажешь, что такое расширение вектора v
будет быстро работать? Меньше за счёт чего? |
Автор: Любитель 9.9.2007, 23:56 |
Уже много раз спорили на эту тему. Вердикт однозначен - в плюсах в 99% случаев использование сишного управления памятью есть зло. Идеологическое зло ![]() |
Автор: UnrealMan 10.9.2007, 00:03 | ||
Так-то оно так, но по эффективности realloc (там, где его можно применять именно как средство перераспределения памяти) всё-таки лучше ![]() |
Автор: Любитель 10.9.2007, 00:35 |
Вряд ли лучше. Но даже если так, то эти накладные расходы относительно размера вектора можно считать постоянными и достаточно малыми. Ими стоит пренебречь в 99% случаев ![]() |
Автор: JackYF 10.9.2007, 00:50 | ||
Ужас какой... tmp.reserve(v.size()+1); tmp.push_back(что_надо); Конечно, если так расширять, как ты показал... ну так блин, я тоже могу микроскопом гвозди забивать... пока микроскоп не развалится ![]() |
Автор: Любитель 10.9.2007, 00:55 |
Тут не в этом дело ![]() |
Автор: UnrealMan 10.9.2007, 01:28 | ||
Ну так и не надо realloc каждый раз вызывать. При его использовании тоже можно резервировать память. Однако, при вызове realloc полного перераспределения памяти может и не происходить. |
Автор: Любитель 10.9.2007, 01:48 | ||
При расщирении вектора тоже. |
Автор: UnrealMan 10.9.2007, 10:10 |
Покажи мне хоть одну такую распространённую реализацию вектора, где при расширении вектора в случае нехватки capacity полного перераспределения памяти не происходит. |
Автор: JackYF 10.9.2007, 14:24 | ||
Может, и не покажем. Зато можно создать вектор не POD-объектов, а realloc про new/delete не знает ничего. |
Автор: UnrealMan 10.9.2007, 17:32 | ||
Об этом речи не идёт. Кроме того, даже с не POD-объектами вектор работает неэффективно. Более эффективная реализация подразумевает использование move-конструкторов для перемещения элементов на новый участок памяти, вместо того чтобы всюду тупо вызывать для них copy-конструкторы. Для того же вектора конструктор перемещения можно реализовать гораздо эффективнее копирующего конструктора. Добавлено через 1 минуту и 8 секунд Значит, realloc всё-таки эффективней ![]() |