Nov. 22nd, 2009

avva: (Default)
В обсуждении о компиляторах всплыл полезный совет: иногда об освобождении памяти лучше и не думать.
Memory leaks are the least of your problems in a compiler; it's not like it's a long running process. You run it, it terminates, the OS cleans up for you.
I did some work on SDCC years ago and it went through a brief "lets use a garbage collector!" phase until everybody realized it was contributing negative value. It was more efficient to simply free memory where convenient and leak it where not.

... и дальше:

I believe it's well known that compilers leak memory like sieves. But the thing is, it doesn't really matter in most contexts. If the leak is linear with the size of the program you're probably fine and no one will notice anyway.


(кстати, всю эту дискуссию о компиляторах стоит проглядеть: там есть немало отличных ссылок)

Это очень полезный совет: иногда в языке и среде, которые казалось бы требуют тщательной работы с malloc()/free() или их эквивалентами, про free() можно просто забыть и не делать, если программа выполняется быстро и не требует очень много памяти. Полезный потому, что привыкший к тщательной дисциплине программист может об этом просто не подумать.

Но мне это напомнило еще вот какую давнюю мысль: по-моему, намного реже, чем следовало бы, программисты на языках с эксплицитной обработкой памяти пользуются отдельными кучами. "Отдельная куча" (private heap) означает всего лишь возможность отводить память в отдельном месте, идентифицируемом каким-то ключом. Например, в Win32 есть функции: HeapCreate() создает новую кучу и возвращает идентификатор, HeapAlloc() - вместе с желаемым размером получает идентификатор кучи и отводит память именно в ней, HeapFree() - очевидно, и HeapDestroy() - удалить всю кучу вместе со всей памятью в ней, которой еще не сделали HeapFree().

Иногда это называют не кучей, а "ареной", но суть та же. На самом деле самое главное во всем этом - возможность удалить кучу одним махом, потому что если она есть, и если вся память, что отводится из кучи, вместе не слишком велика, то отдельно освобождать ничего не надо. Собственно, можно обойтись без free() вообще. Куча тогда превращается в сплошной кусок памяти (или связанный список таких кускок, если надо), а malloc() становится тривиальным, он просто двигает указатель на свободную часть кучи.

Очень часто значительная часть логики программы устроена так. Начинаем строить какой-то объект (в C это может быть сложная структура, неважно), он в свою очередь создает и инициализирует другие объекты внутри себя, или целые массивы, или списки, или еще что, неважно. Все это по цепочке вложено друг в друга, а после создания еще начинает как-то работать и двигаться вместе, вызывать друг друга, хранить какую-то информацию итд. В конце концов объект выполнил свое дело и удаляется, по цепочке вначале удаляя все вложенные объекты и контейнеры и освобождая всю память. Все это делается через сложный танец new/delete или malloc/free. Но если вся память, что нужна объекту и всему, что в него вложено, не слишком велика на протяжении его жизни, то с помощью отдельной кучи только для этого объекта и всего, что в него вложено, можно избежать всего этого сложного танца и сделать код одновременно намного проще, лучше защищенным от ошибок и даже быстрее - да-да, быстрее, чем обычный танец malloc/free. Единственное, чем платишь - повышенным расходом памяти во время жизни объекта, да и то часто налог этот весьма невелик.

Я уже лет десять как не пишу под Windows, но до сих пор помню, какими полезными и правильными были функции для работы с отдельными кучами. Конечно, каждый может сам на коленке сколотить что-то свое для этого; я не раз такое встречал, да и сам несколько раз писал. Но все же меня удивляет, что в Юниксе нет стандартного интерфейса для этого дела. И я не раз видел исходники библиотек или приложений, которые бы этот простой прием сильно упростил и улучшил.
avva: (Default)
Скандал: неизвестный хакер взломал почтовые сервера университета Восточной Англии, где находится престижный центр исследований климата CRU, украл много архивов почты и опубликовал. Среди частных писем климатологов обнаружилось множество обсуждений того, как бы покрасивей нарисовать графы, чтобы глобальное потепление было более очевидным; как не допустить, чтобы исходные данные попали в руки "скептиков"; ипроч. и проч.

Ссылки:
- украденные письма (огромный архив)
- основные "находки", т.е. по мнению "скептиков", компрометирующие письма и отрывки из писем
- мнение мейнстримных климатологов, на одном из главных блогов на эту тему. Если вкратце, то его можно описать так: в украденных письмах есть несколько выглядящих подозрительно и неприятно выражений, но в основном это совершенно нормальный обмен письмами между учеными, не стремящихся ничего скрыть или обмануть, а цитаты, которые якобы это доказывают, вырваны из контекста.
- интересное обсуждение в Hacker News
- другие интересные ссылки на эту тему приветствуются.

Сам я не решил пока, что думать, читаю письма и перепалки на realclimate потихоньку.

слова

Nov. 22nd, 2009 08:46 pm
avva: (Default)
Русские слова "проглядеть" и "просмотреть" имеют два почти противоположных значения: быстро пройтись по чему-то взглядом, но все же увидеть - и не увидеть, упустить. Любопытное сходство: английские слова oversee и overlook - тоже. Оба они могут означать - если не сейчас, то в прошлом могли означать - как "наблюдать за чем-то" (и отсюда в расширенном значении - надзирать, контролировать), так и "упустить, не увидеть что-то".

По OED можно проследить, как в английском эта пара слов постепенно стремится поделить между собой эти два значения, обособиться друг от друга. Oversee уже в современном языке не используется в значении "упустить", оно помечено как устаревшее. Overlook, наоборот, сегодня почти всегда означает именно "упустить", а "наблюдать" - редкое значение, хоть и не совершенно ушедшее из языка. Оно сохраняется, например, в переносном значении в применении к неодушевленным объектам ("The house overlooked the garden").

В русском языке это обособление пока не произошло, но по-моему, к этому идет. Кажется, "проглядеть" чаще используют в значении "упустить, прозевать", а "просмотреть" - в значении "быстро пройтись взглядом". Словари это пока не фиксируют.

1. Я просмотрел свежий выпуск газеты.
2. Я проглядел свежий выпуск газеты.
3. То ли я проглядел, то ли там этого действительно не было.
4. То ли я просмотрел, то ли там этого действительно не было.
5. Как же это я проглядел эту ошибку!
6. Как же это я просмотрел эту ошибку!

Я бы сказал, что 1,3,5 встречаются чаще, чем 2,4,6. Верно ведь? Возможно, еще лет через сто варианты 2,4,6 станут вообще невозможными.

June 2025

S M T W T F S
123 4 5 6 7
8 910 11 12 13 14
15 16 1718192021
22232425262728
2930     

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 17th, 2025 06:37 pm
Powered by Dreamwidth Studios
OSZAR »