avva: (Default)
avva ([personal profile] avva) wrote2016-05-01 02:47 am

программистское, замыкания

(эта запись может быть интересна только программистам)

Оказывается, в gcc уже черт знает сколько лет существуют замыкания в виде вложенных функций. Настоящие замыкания! Но только в C, в C++ они не работают (в C++ теперь есть лямбды, но это ж недавно).

А мужики-то и не знали! Если серьезно, я поражен.

Update. Карнавал отменяется. Это не настоящие замыкания, они не сохраняют жизнь пойманным локальным переменным при выходе из функции. Ну, так неинтересно. Как-то даже обидно стало. Пустышка.

Ладно, будем лямбды значит внедрять в народное хозяйство. Кстати, пару недель назад впервые написал настоящую лямбду в рабочем коде на C++.

[identity profile] spamsink.livejournal.com 2016-05-01 12:36 am (UTC)(link)
Мужики знали, но это была чисто gcc-шная фича, поэтому в реальной жизни плохо применимая.

[identity profile] ticklish-frog.livejournal.com 2016-05-06 09:55 am (UTC)(link)
К сожалению, эта фича в реальной жизни привела к тому, что у нас, независимо от того, используем или нет эти вложенные функции, исполняемый стек. Причина в том, что эти функции хранятся в стеке, и должны быть вызываемыми, стек надо сделать исполняемым, если есть такие функции в исходном коде. Системы opt-in, чтобы компилятор аннотировал модули, для которых стек должен быть исполняемым, придумано поначалу не было, поэтому пришлось разрешить исполнение по умолчанию, и ввели аннотации по принципу opt-out. Потом, конечно, ввели и opt-in аннотации. Но до сих пор встречаются модули без аннотаций, которе, если попадают в результат при сборке, заставляют делать стек исполняемым, поскольку неясно, есть ли такие функции в модуле.

Вот тут подробно написано: http://www.airs.com/blog/archives/518