Size: a a a

2021 January 22

И

Игорь in dlang.ru
Тающий звук
Потому что t каждый раз отводится заново, все экземпляры t для каждой итерации различны — это никак не связанные переменные и в каждой итерации цикла в лямбду подставляется конкретный экземпляр t, так как он подставляется именно в этом месте компилятор должен сохранить ссылку именно на этот экземпляр t. А смешивать все t в одну кучу - это не правильно, т.к. они не равны между собой — они каждый раз отводятся заново судя по логике программы.
компилятор не знает сколько таких t му нужно будт хранить в стеке
источник

Т

Тающий звук... in dlang.ru
Как он может при вызове первой лямбды сослаться на последний экземпляр t, если он был заного пересоздан в последней итерайии цикла и первая итерация цикла о нём ещё не знала ?
источник

И

Игорь in dlang.ru
как он зарезервирует для них место?
источник

И

Игорь in dlang.ru
Тающий звук
Как он может при вызове первой лямбды сослаться на последний экземпляр t, если он был заного пересоздан в последней итерайии цикла и первая итерация цикла о нём ещё не знала ?
просто подумай об этом
источник

Т

Тающий звук... in dlang.ru
Игорь
компилятор не знает сколько таких t му нужно будт хранить в стеке
Верно, поэтому для данной ситуации он может воспользоваться кучей — это если он не может заранее определить длину цикла
источник

МВ

Макс Воробьев... in dlang.ru
Игорь
просто подумай об этом
как ++ с std::function
источник

Т

Тающий звук... in dlang.ru
Игорь
просто подумай об этом
Я об этом подумал ещё до этого общения
источник

МВ

Макс Воробьев... in dlang.ru
т е в дин памяти
источник

И

Игорь in dlang.ru
Макс Воробьев
т е в дин памяти
видимо решили так не делать
источник

И

Игорь in dlang.ru
я не знаю хорошо эт или нет. просто это обьясняет такое повеоедние
источник

МВ

Макс Воробьев... in dlang.ru
как по мне, сам факт того, что
void main() {
   alias func = void delegate();
   func[] cbs;
   foreach (int k; 0..3) {
       cbs ~= () => k.writeln;
       
   }
   foreach(d; cbs) d();
}
выводит 2 2 2, а
struct TestIter {
   int opApply(scope int delegate(int) dg) {
       for (int k=1; k<=3; ++k) {
           dg(k);
       }
       return 1;
   }
}

void main() {
   alias func = void delegate();
   func[] cbs;
   foreach (int k; TestIter()) {
       cbs ~= () => k.writeln;
       
   }
   foreach(d; cbs) d();
}
выводит 0 1 2, говорит о том, что что-то пошло не так
источник

И

Игорь in dlang.ru
возможно ради перформанса
источник

O

Oleg in dlang.ru
нее, обычно лямбда и создает свой контекст в куче.. но в Д еще могут быть inline/inplace лямбды - если она вызывается здесь же (и только), то незачем ее кидать в кучу, потому что она дальше текущего контекста никуда не идет, и ее размещают прям в текущем стеке
источник

И

Игорь in dlang.ru
Oleg
нее, обычно лямбда и создает свой контекст в куче.. но в Д еще могут быть inline/inplace лямбды - если она вызывается здесь же (и только), то незачем ее кидать в кучу, потому что она дальше текущего контекста никуда не идет, и ее размещают прям в текущем стеке
вот скорее всего так иесть
источник

МВ

Макс Воробьев... in dlang.ru
Oleg
нее, обычно лямбда и создает свой контекст в куче.. но в Д еще могут быть inline/inplace лямбды - если она вызывается здесь же (и только), то незачем ее кидать в кучу, потому что она дальше текущего контекста никуда не идет, и ее размещают прям в текущем стеке
не уверен, что лямбды в ++ создают контекст сразу в куче
источник

И

Игорь in dlang.ru
хочется разных контестов для замыкания - создавай их
источник

МВ

Макс Воробьев... in dlang.ru
но там и контекст указан явно
источник

Т

Тающий звук... in dlang.ru
Oleg
нее, обычно лямбда и создает свой контекст в куче.. но в Д еще могут быть inline/inplace лямбды - если она вызывается здесь же (и только), то незачем ее кидать в кучу, потому что она дальше текущего контекста никуда не идет, и ее размещают прям в текущем стеке
Так не лямбда создавать должна, а для лямбды должны где-то значение сохранить
источник

И

Игорь in dlang.ru
Тающий звук
Так не лямбда создавать должна, а для лямбды должны где-то значение сохранить
кто должен, где и как?
источник

O

Oleg in dlang.ru
компилятор
источник