Size: a a a

2021 January 22

МВ

Макс Воробьев... in dlang.ru
Макс Воробьев
destroyed 0
destroyed 1
destroyed 2
2
2
2
вот это явно выглядит как wtf
источник

И

Игорь in dlang.ru
Макс Воробьев
    alias func = void delegate();
   func[] cbs;
   foreach (int k; 0..3) {
       int t = k;
       cbs ~= () => t.writeln;
   }
   foreach(d; cbs) d();
t тут на стеке нет темболее
так где хранится t? я просто тоже хочу разобраться
источник

МВ

Макс Воробьев... in dlang.ru
Игорь
так где хранится t? я просто тоже хочу разобраться
t - на стеке. контекст внутри фора, т е каждую итерацию t создается и удаляется
источник

МВ

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

И

Игорь in dlang.ru
Макс Воробьев
t - на стеке. контекст внутри фора, т е каждую итерацию t создается и удаляется
где в памяти находится тот t который t.writeln ?
источник

МВ

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

МВ

Макс Воробьев... in dlang.ru
Игорь
где в памяти находится тот t который t.writeln ?
а х его знает
источник

И

Игорь in dlang.ru
Макс Воробьев
а х его знает
а варианта два - в стеке или в куче
источник

МВ

Макс Воробьев... in dlang.ru
Игорь
а варианта два - в стеке или в куче
3. в куче может храниться ссылка на стек)
источник

Т

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

Т

Тающий звук... in dlang.ru
Игорь
а варианта два - в стеке или в куче
Скорее всего в стеке
источник

Т

Тающий звук... in dlang.ru
godbolt там можно посмотреть в ассемблере куда он его пихает
источник

И

Игорь in dlang.ru
Макс Воробьев
3. в куче может храниться ссылка на стек)
ну вот моё предположение что под t забито место в стеке. соответственно в этом месте хранится последнее значение, оно и печатается.
источник

Т

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

Т

Тающий звук... in dlang.ru
Он вполне может хранить в стеке 3 значения
источник

И

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

Т

Тающий звук... in dlang.ru
С другой стороны, если цикл будет слишком блинный, то может произойти переполнение стека
источник

МВ

Макс Воробьев... in dlang.ru
в теории,если вставить чуть больше операций между созданием лямбд и выводом, то значение т можно перетереть
источник

И

Игорь in dlang.ru
Макс Воробьев
в теории,если вставить чуть больше операций между созданием лямбд и выводом, то значение т можно перетереть
компилятор может вычислить куда его положить что-бы не затереть
источник

Т

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