2014 dxdy logo

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

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




На страницу 1, 2  След.
 
 досоздание массива :) С++
Сообщение07.10.2009, 17:41 
Вобщем такая проблема возникала:
Уак довыделить памяти в в динамическом массиве, если мне вдруг длинны массива не хватило не хватает походу дела(вернее как это сделать нетопорным методом)?
//visual c++
//Можна ссылкой, векторы не предлагать...

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

 
 
 
 Re: досоздание массива :) С++
Сообщение07.10.2009, 17:53 
Никак. Либо вектор, либо "топорным методом".

 
 
 
 Re: досоздание массива :) С++
Сообщение07.10.2009, 17:55 
я очень сомневаюсь что никак.

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

 
 
 
 Re: досоздание массива :) С++
Сообщение07.10.2009, 18:07 
как раз это я и подрузомевал под топорным методом, мне не нравится то что если длинный массив(очень длинный) то на два сразу памяти может нехватить, а это неправильно,

 
 
 
 Re: досоздание массива :) С++
Сообщение07.10.2009, 18:17 
Nerazumovskiy в сообщении #249863 писал(а):
на два сразу памяти может нехватить, а это неправильно
Чудес не бывает. Runtime не может сдвинуть все объекты в куче и освободить память под увеличение размера "по месту".

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

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

 
 
 
 Re: досоздание массива :) С++
Сообщение07.10.2009, 18:34 
Спасибо, но наверно прийдётся топором(мне просто было интересно что да как).

 
 
 
 Re: досоздание массива :) С++
Сообщение07.10.2009, 20:55 
Практически единственный способ - перегрузка операторов new и delete и реализация собственных алгоритмов работы с кучей. Как только напишите эффективные алгоритмы, позволяющие "довыделять" память к существующему массиву в довольно общем случае и работающие эффективно - не забудьте поделиться :).

 
 
 
 Re: досоздание массива :) С++
Сообщение07.10.2009, 21:04 
ну чесно говоря я реализовываю этот механизм какраз для того чтобы не иметь напрямую дело выделением памяти :), но до написания эфективных алгоритмов роботы с кучей мне далековато :)

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

 
 
 
 Re: досоздание массива :) С++
Сообщение07.10.2009, 22:14 
Аватара пользователя
Еще вариант - вместо массива воспользоваться контейнером map - он автоматически выделяет память по мере необходимости.

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

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

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

 
 
 
 Re: досоздание массива :) С++
Сообщение08.10.2009, 01:23 
Спасибо, venco. Это понятно. Просто, насколько я понял, идея была в том, чтобы переписать new и delete так, чтобы они работали, например, с системной кучей, и добавить какую-нибудь функцию типа realloc (вызваемую явно), которая в этой же куче изменяла бы размер выделенного блока "по месту" (без копирования).

 
 
 
 Re: досоздание массива :) С++
Сообщение08.10.2009, 01:38 
Таким образом вы измените функцию, которую вызывает компилятор на первом шаге.
Всё остальное будет сделано всё равно.
Чтобы этого избежать придётся отказаться от new Object[], и реализовать всё какими-нибудь макросами. Возможно, но неудобно.

 
 
 [ Сообщений: 23 ]  На страницу 1, 2  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group