При создании большого массива [1000000] system monitor показывает, что после delete память освобождаеться полностью. Если же создать массив [100000], то освобождаеться на 4Кб меньше, чем выделяеться при создании. При малых массивах [100] монитор не показывает увеличение privat bytes. Я новичок, обясните кто-нибудь от чего такой результат
Здравствуйте, Malyj, Вы писали:
M>При создании большого массива [1000000] system monitor показывает, что после delete память освобождаеться полностью. Если же создать массив [100000], то освобождаеться на 4Кб меньше, чем выделяеться при создании. При малых массивах [100] монитор не показывает увеличение privat bytes. Я новичок, обясните кто-нибудь от чего такой результат
Особенности реализации кучи в CRT. Т.е. поверх сервисов управления памятью, предоставляемых OC(VirtualAlloc например) существует дополнительный слой. Что там происходит — зависит от производителя, режимов компиляции, run-time настроек(могут присутствовать дополнительные функции для регулирования некоторых режимов) и т.п.
дополнительно к вышесказанному я бы еще порекомендовал не использовать кучу для выделения таких больших массивов.
проклятый антисутенерский закон
Re[3]: Вопрос по delete[]
От:
Аноним
Дата:
14.03.08 10:59
Оценка:
Здравствуйте, игппук, Вы писали:
И>дополнительно к вышесказанному я бы еще порекомендовал не использовать кучу для выделения таких больших массивов.
А что использовать?
Re[3]: Вопрос по delete[]
От:
Аноним
Дата:
14.03.08 11:00
Оценка:
Здравствуйте, игппук, Вы писали:
И>дополнительно к вышесказанному я бы еще порекомендовал не использовать кучу для выделения таких больших массивов.
А где? На стеке?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, игппук, Вы писали:
И>>дополнительно к вышесказанному я бы еще порекомендовал не использовать кучу для выделения таких больших массивов. А>А где? На стеке? :super:
Можно на стеке (если влезет :)), можно статически, можно даже как memory mapped file.
Здравствуйте, Malyj, Вы писали:
M>При создании большого массива [1000000] system monitor показывает, что после delete память освобождаеться полностью. Если же создать массив [100000], то освобождаеться на 4Кб меньше, чем выделяеться при создании. При малых массивах [100] монитор не показывает увеличение privat bytes. Я новичок, обясните кто-нибудь от чего такой результат
M>
M>bool* pbArr = new bool[100000];
M>delete[] pbArr;
M>
Оператор new нужно создовать не больших обем память, а для больших обьем память стоит использовать GlobalAlloc, new не всегда коретно освобождает память.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Malyj, Вы писали:
M>>При создании большого массива [1000000] system monitor показывает, что после delete память освобождаеться полностью. Если же создать массив [100000], то освобождаеться на 4Кб меньше, чем выделяеться при создании. При малых массивах [100] монитор не показывает увеличение privat bytes. Я новичок, обясните кто-нибудь от чего такой результат
M>>
M>>bool* pbArr = new bool[100000];
M>>delete[] pbArr;
M>>
А>Оператор new нужно создовать не больших обем память, а для больших обьем память стоит использовать GlobalAlloc, new не всегда коретно освобождает память.
Правильнее сказать, new вообще не освобождает память а выделяет. Ну да ладно. GlobalAlloc — это Win Api, что тоже не всегда подходит. Да и bool[100000] это не большой массив. Так что new в общем то не плох, но голые указатели лучше не использовать
Еще добавлю, что использовать массивы bool не желательно. Я создал массив из 10 эл-тов и заполнил true/false/true...
Вот как это показывается в дебагере:
0x0035A478 00 01 00 01 00 01 00 01 00 01
Т.е. смысла в массивах bool никакого, и об этом, если мне память не изменяет, уже много раз писалось.
Здравствуйте, игппук, Вы писали:
И>дополнительно к вышесказанному я бы еще порекомендовал не использовать кучу для выделения таких больших массивов.
А почему? Win API куча вроде бы корректно это всё обрабатывает и большие блоки аллокирует непосредственно через VirtualAlloc. Я подозреваю, что и в OS Linux всё хорошо с этим.
Единственная система, на которой это было не так, которая мне вспоминается -- это MAC OS Classic. Там большие болоки хотелось таки выделять за пределами партиции приложения. Но это очень давно было и очень специфично всё-таки...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Аноним, Вы писали:
А>new не всегда коретно освобождает память.
Ты наверное имеешь в виду, что обычно new не возвращает память системе. Но обычно new себя так ведёт только с относительно небольшими блоками. А большие аллокирует сразу у системы и отдаёт сразу ей.
Насколько я понимаю, это так делается для борьбы с фрагментацией памяти на уровне системы (если в системе это понятие релевантно) и для ускорения работы new/delete
p.s.
Про то, что new обычно вообще редко память освобождает тут уже писали. Смешно сформулировал
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Аноним, Вы писали:
И>>дополнительно к вышесказанному я бы еще порекомендовал не использовать кучу для выделения таких больших массивов. А>А где? На стеке?
Здравствуйте, Erop, Вы писали:
E>А почему? Win API куча вроде бы корректно это всё обрабатывает и большие блоки аллокирует непосредственно через VirtualAlloc. Я подозреваю, что и в OS Linux всё хорошо с этим. E>Единственная система, на которой это было не так, которая мне вспоминается -- это MAC OS Classic. Там большие болоки хотелось таки выделять за пределами партиции приложения. Но это очень давно было и очень специфично всё-таки...
Здравствуйте, игппук, Вы писали:
И>дополнительно к вышесказанному я бы еще порекомендовал не использовать кучу для выделения таких больших массивов.
Развеж это большой? Это мелочь.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, <Аноним>, Вы писали:
А>Оператор new нужно создовать не больших обем память, а для больших обьем память стоит использовать GlobalAlloc, new не всегда коретно освобождает память.
Бред!
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Здравствуйте, Vamp, Вы писали:
sc>>Т.е. смысла в массивах bool никакого, и об этом, если мне память не изменяет, уже много раз писалось. V>Непонятна ваша мысль...
Нет, я конечно не совем прав, смысл есть. Только надо иметь ввиду, что хранится это все не в битах, а как в моем примере, в байтах. И если есть необходимость экономить память, то наверное имеет смысл сделать свой контейнер для bool (естественно stl совместимый). Например, взять за основу std::vector<int> и организовать побитовый доступ к нему.