2017-05-03 10:23 GMT+03:00 Павел Борисов via Moscow-pm <[email protected]>:
> И снова дико извиняюсь, но разве free() возвращает память операционке ? > Нет, если она вызывается непосредственно перед выходом из программы > (процесса), то конечно, память возвращается ОС, но по ходу выполнения > процесса free() просто ОСВОБОЖДАЕТ память для повторного использования в > ЭТОМ же процессе. Поправьте меня, если я не прав... И правы и неправы. malloc, realloc, free и друзья реализуются на уровне libc. Вот документация https://www.gnu.org/software/libc/manual/html_node/Memory-Allocation.html. До определенного размера память процессу выделяется из "преаллоцированых" у системы кусков (arenas). Если в такой арене занят хоть один байт, то она не вернется в систему. Если говорить про perl, то тут много вариантов. Откройте malloc.c в исходниках и читайте комменты вначале. Кроме этих опций есть еще опции, которые совсем отключают собственную реализацию malloc в perl. Не помню точное название, но что-то вроде MYMALLOC или MALLOC_WRAP. Есть еще третья сторона: оптимизация выделения памяти под локальные переменные. Если у вас есть код: for ( my $i = 0; $i<@_; $i++) { ... } то будет глупо выделять каждый раз память для SV IV структуры при каждом входе в функцию. Для этих переменных есть специальный массив PADLIST и после окончания блока память не освобождается, а остается зарезервированной для дальнейшего использования. С IV все просто, но вот с SV PV это значит, что все что было выделено под PV останется зарезервировано за этой SV и следовательно функцией. По этому если вы делаете так: sub foo { my $big_data_chunk = shift; ... } foo("x" x 1000_000); Чтобы этого избежать вы делаете предварительно: undef $big_data_chunk; -- Best regards, Ruslan.
-- Moscow.pm mailing list [email protected] | http://moscow.pm.org
