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

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




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

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

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

 Re: досоздание массива :) С++
я очень сомневаюсь что никак.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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