2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 досоздание массива :) С++
Сообщение07.10.2009, 17:41 


23/12/08
245
Украина
Вобщем такая проблема возникала:
Уак довыделить памяти в в динамическом массиве, если мне вдруг длинны массива не хватило не хватает походу дела(вернее как это сделать нетопорным методом)?
//visual c++
//Можна ссылкой, векторы не предлагать...

Надеюсь формулировка понятная :wink:

 Профиль  
                  
 
 Re: досоздание массива :) С++
Сообщение07.10.2009, 17:53 
Заслуженный участник


04/05/09
4587
Никак. Либо вектор, либо "топорным методом".

 Профиль  
                  
 
 Re: досоздание массива :) С++
Сообщение07.10.2009, 17:55 


23/12/08
245
Украина
я очень сомневаюсь что никак.

 Профиль  
                  
 
 Re: досоздание массива :) С++
Сообщение07.10.2009, 17:59 
Заслуженный участник


09/08/09
3438
С.Петербург
Nerazumovskiy в сообщении #249858 писал(а):
я очень сомневаюсь что никак
Сомневаться - Ваше неотъемлемое право.
Создаете новый массив, копируете в него содержимое старого, старый освобождаете.
Ну или realloc

 Профиль  
                  
 
 Re: досоздание массива :) С++
Сообщение07.10.2009, 18:07 


23/12/08
245
Украина
как раз это я и подрузомевал под топорным методом, мне не нравится то что если длинный массив(очень длинный) то на два сразу памяти может нехватить, а это неправильно,

 Профиль  
                  
 
 Re: досоздание массива :) С++
Сообщение07.10.2009, 18:17 
Заслуженный участник


09/08/09
3438
С.Петербург
Nerazumovskiy в сообщении #249863 писал(а):
на два сразу памяти может нехватить, а это неправильно
Чудес не бывает. Runtime не может сдвинуть все объекты в куче и освободить память под увеличение размера "по месту".

-- Ср окт 07, 2009 19:26:06 --

Еще можно пользоваться системной кучей и менять размер через HeapReAlloc.
Но это к C++ уже никакого отношения не имеет.

 Профиль  
                  
 
 Re: досоздание массива :) С++
Сообщение07.10.2009, 18:34 


23/12/08
245
Украина
Спасибо, но наверно прийдётся топором(мне просто было интересно что да как).

 Профиль  
                  
 
 Re: досоздание массива :) С++
Сообщение07.10.2009, 20:55 


21/03/06
1545
Москва
Практически единственный способ - перегрузка операторов new и delete и реализация собственных алгоритмов работы с кучей. Как только напишите эффективные алгоритмы, позволяющие "довыделять" память к существующему массиву в довольно общем случае и работающие эффективно - не забудьте поделиться :).

 Профиль  
                  
 
 Re: досоздание массива :) С++
Сообщение07.10.2009, 21:04 


23/12/08
245
Украина
ну чесно говоря я реализовываю этот механизм какраз для того чтобы не иметь напрямую дело выделением памяти :), но до написания эфективных алгоритмов роботы с кучей мне далековато :)

 Профиль  
                  
 
 Re: досоздание массива :) С++
Сообщение07.10.2009, 21:41 
Заслуженный участник


04/05/09
4587
e2e4 в сообщении #249915 писал(а):
Практически единственный способ - перегрузка операторов new и delete и реализация собственных алгоритмов работы с кучей. Как только напишите эффективные алгоритмы, позволяющие "довыделять" память к существующему массиву в довольно общем случае и работающие эффективно - не забудьте поделиться :).
Не поможет это, придётся ещё отказаться от использования конструкции new, т.к. компилятор после вызова оператора new будет ещё автоматически конструировать объекты поверх существующих.

 Профиль  
                  
 
 Re: досоздание массива :) С++
Сообщение07.10.2009, 22:14 
Модератор
Аватара пользователя


11/01/06
5702
Еще вариант - вместо массива воспользоваться контейнером map - он автоматически выделяет память по мере необходимости.

 Профиль  
                  
 
 Re: досоздание массива :) С++
Сообщение07.10.2009, 23:50 
Заслуженный участник


09/08/09
3438
С.Петербург
venco в сообщении #249933 писал(а):
Не поможет это, придётся ещё отказаться от использования конструкции new, т.к. компилятор после вызова оператора new будет ещё автоматически конструировать объекты поверх существующих.
А в чем там проблемы? Что значит "конструировать объекты поверх существующих"?

 Профиль  
                  
 
 Re: досоздание массива :) С++
Сообщение08.10.2009, 01:12 
Заслуженный участник


04/05/09
4587
Если в программе написано:
new Object[12];
то компилятор сгенерит следующее:
1.
Вызовет operator new[](12*sizeof(Object)), который должен выделить память или послать bad_alloc.
2.
Вызовет конструкторы по умолчанию для этих 12 объектов.
Если в процессе конструирования появится исключение, то вызовет деструкторы для уже сконструированных объектов, затем вызовет operator delete[] и пошлёт исключение дальше.

Переопределение функции operator new[](), например по типу realloc(), ничего не изменит в этой последовательности, т.е. новые объекты будут сконструированы заново, а старое их содержимое, если оно было, потеряется.

 Профиль  
                  
 
 Re: досоздание массива :) С++
Сообщение08.10.2009, 01:23 
Заслуженный участник


09/08/09
3438
С.Петербург
Спасибо, venco. Это понятно. Просто, насколько я понял, идея была в том, чтобы переписать new и delete так, чтобы они работали, например, с системной кучей, и добавить какую-нибудь функцию типа realloc (вызваемую явно), которая в этой же куче изменяла бы размер выделенного блока "по месту" (без копирования).

 Профиль  
                  
 
 Re: досоздание массива :) С++
Сообщение08.10.2009, 01:38 
Заслуженный участник


04/05/09
4587
Таким образом вы измените функцию, которую вызывает компилятор на первом шаге.
Всё остальное будет сделано всё равно.
Чтобы этого избежать придётся отказаться от new Object[], и реализовать всё какими-нибудь макросами. Возможно, но неудобно.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group