История изменений
Исправление den73, (текущая версия) :
по сути инициализации блока памяти на стеке, то есть пара ассемблерных инструкций
Если ты посмотришь в инспекторе на лямбду, то там есть «значения, которые она замыкает». Если такие значения есть, то нужно заполнить в структуре все поля ссылками на те места, откуда они выросли. Плюс переменные, к-рые она замыкает, в каких-то случаях должны иметь некий «box» (собственно место хранения переменной), к-рый должен быть выделен не в стеке, а в куче. Поскольку две лямбды, замыкающие одну и ту же переменную, сохраняют связь между собой на всю оставшуюся жизнь. Твоя лямбда замыкает accessors, значит, что-то из перечисленного к ней может относиться.
Кроме того, accessor-ы структур объявлены как inline. Если ты передаёшь их в функцию, то они становятся медленнее во много раз (полный вызов функции вместо косвенной адресации с константным смещением).
Исходная версия den73, :
по сути инициализации блока памяти на стеке, то есть пара ассемблерных инструкций
Если ты посмотришь в инспекторе на лямбду, то там есть «значения, которые она замыкает». Если такие значения есть, то нужно заполнить в структуре все поля ссылками на те места, откуда они выросли. Плюс переменные, к-рые она замыкает, в каких-то случаях должны иметь некий «box» (собственно место хранения переменной), к-рый должен быть выделен не в стеке, а в куче. Поскольку две лямбды, замыкающие одну и ту же переменную, сохраняют связь между собой на всю оставшуюся жизнь. Твоя лямбда замыкает accessors, значит, что-то из перечисленного к ней может относиться.
Кроме того, accessor-ы структур объявлены как inline. Если ты передаёшь их в функцию, то они становятся медленнее во много раз (полный вызов функции).