<div dir="ltr"><div class="gmail_extra"><br><div class="gmail_quote">2017-05-03 10:23 GMT+03:00 Павел Борисов via Moscow-pm <span dir="ltr"><<a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a>></span>:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">И снова дико извиняюсь, но разве free() возвращает память операционке ? Нет, если она вызывается непосредственно перед выходом из программы (процесса), то конечно, память возвращается ОС, но по ходу выполнения процесса free() просто ОСВОБОЖДАЕТ память для повторного использования в ЭТОМ же процессе. Поправьте меня, если я не прав...</blockquote></div><br>И правы и неправы. malloc, realloc, free и друзья реализуются на уровне libc. Вот документация <a href="https://www.gnu.org/software/libc/manual/html_node/Memory-Allocation.html">https://www.gnu.org/software/libc/manual/html_node/Memory-Allocation.html</a>. До определенного размера память процессу выделяется из "преаллоцированых" у системы кусков (arenas). Если в такой арене занят хоть один байт, то она не вернется в систему. </div><div class="gmail_extra"><br></div><div class="gmail_extra">Если говорить про perl, то тут много вариантов. Откройте malloc.c в исходниках и читайте комменты вначале. Кроме этих опций есть еще опции, которые совсем отключают собственную реализацию malloc в perl. Не помню точное название, но что-то вроде MYMALLOC или MALLOC_WRAP.</div><div class="gmail_extra"><br></div><div class="gmail_extra">Есть еще третья сторона: оптимизация выделения памяти под локальные переменные. Если у вас есть код:</div><div class="gmail_extra"><br></div><div class="gmail_extra">for ( my $i = 0; $i<@_; $i++) {</div><div class="gmail_extra">...</div><div class="gmail_extra">}</div><div class="gmail_extra"><br></div><div class="gmail_extra">то будет глупо выделять каждый раз память для SV IV структуры при каждом входе в функцию. Для этих переменных есть специальный массив PADLIST и после окончания блока память не освобождается, а остается зарезервированной для дальнейшего использования. С IV все просто, но вот с SV PV это значит, что все что было выделено под PV останется зарезервировано за этой SV и следовательно функцией. По этому если вы делаете так:</div><div class="gmail_extra"><br></div><div class="gmail_extra">sub foo {</div><div class="gmail_extra">    my $big_data_chunk = shift;</div><div class="gmail_extra">    ...</div><div class="gmail_extra">}</div><div class="gmail_extra"><br></div><div class="gmail_extra">foo("x" x 1000_000);<br clear="all"><div><br></div><div>Чтобы этого избежать вы делаете предварительно:</div><div><br></div><div>undef $big_data_chunk;</div><div><br></div><div><br></div>-- <br><div class="gmail_signature">Best regards, Ruslan.</div>
</div></div>