@dlangru

Страница 427 из 719
Evgeny
04.03.2018
12:41:04
или что подразумевается по "рантаймом"?

Dark
04.03.2018
12:41:30
А зачем это делать во время компиляции?
А зачем запускать лишний раз gc, если уже на этапе компиляции понятно, что можно эти ресурсы высвободить

Evgeny
04.03.2018
12:41:30
рантайм библиотека или противоположность компайл-тайм?

Google
Evgeny
04.03.2018
12:42:22
Второе
что-то как-то смешались в кучу кони, люди.

классы как бы всегда освобождаются в рантайме (разве что функцию в режиме CTFE вызвать)

Нифига ведь непонятно

Dark
04.03.2018
12:46:24
классы как бы всегда освобождаются в рантайме (разве что функцию в режиме CTFE вызвать)
Я немного не так выразился. GC выясняет в рантайме, что можно вот эту память высвободить. Но с другой стороны, мы можем на этапе компиляции знать, что дальше эту память вообще никак не используют, можно сразу же её детерменированно высвободить.

Evgeny
04.03.2018
12:47:33
В большинстве случаев не можем это определить на стадии компиляции. Только если объект на стеке создан, тогда можем.

Dmitry
04.03.2018
12:48:50
точнее scoped делает класс, но взвращает обертку вокруг него, а не сам класс.
Ты имеешь ввиду, что возвращается структура, внутри которой идет инициализация класса и там же расположен деструктор, который срабатывает как только эта структура уходит со стека?

Evgeny
04.03.2018
12:49:15
еще структура умеет проксировать обращение к классу

Допустим такой вот код { auto a = new A() a.doWork(); } может ли компилятор уничтожить класс в переменной a при выходе из скоупа?

Evgeny
04.03.2018
12:51:59
Зависит от реализации doWork.
хуже, это зависит еще и от реализации конструктора класса A

Google
Dmitry
04.03.2018
12:52:18
А вот как проверить где был класс создан? Или структура? Просто для меня стек и куча это просто абстракции, и я вынужден или верить документации или просто тыкать пальцем в небо. Ну вот пишу я: int a=1; Есть способ наглядно представить то что в этот момент в Дишном коде происходит. Ну я не знаю там столбец в виде стека и в нем записана единичка. Или там string x = "hello"; и в стеке ссылка, а значение в облаке под названием "куча"

Evgeny
04.03.2018
12:53:18
С чего бы?
ну например в конструкторе класс может зарегистрировать сам себя в некоем глобальном реестре или запустить новый поток и передать туда ссылку на самого себя.

Dark
04.03.2018
12:56:01
Но в целом, то о чем ты говоришь вполне возможно. В одном языке - Rust
Почему только в одном? Мы же можем определить в компайлтайме, есть ли там сайд-эффекты со ссылкой на класс или нет

Evgeny
04.03.2018
12:56:35
реализация может быть вообще в сторонней бинарной либе

но может есть еще подобные языки, я только один знаю - rust

Dark
04.03.2018
12:57:52
реализация может быть вообще в сторонней бинарной либе
Такие места и будут висеть на gc, а в тех случаях, что мы можем определить будем определять

Evgeny
04.03.2018
12:58:55
в какой-то степени это возможно, но сложно. особенно если учесть, что компилятор можно обмануть всякими cast.

Evgeny
04.03.2018
12:59:58
Насчёт наглядно представить. Есть два вариант - посмотреть асм, либо понять, как вообще решают, что где хранится
как я понимаю, Дмитрий имеет в виду определить в рантайме для уже созданного где-то неизвестно где объекта.

Dmitry
04.03.2018
13:00:11
Ну асм увы для меня это не очень наглядно, я его плохо знаю. Просто для меня стек и куча это просто абстракции которые приходится силой держать в голове.

Evgeny
04.03.2018
13:01:02
ассоциативные массивы тоже - куча.

Dmitry
04.03.2018
13:01:58
Вот я пишу File file = File("my.txt"); Но в то же время по идее могу написать и: File new file = File("my.txt"); Только иного пути как верить докам у меня нет. Евгений, на счет new понял

но мне хотелось бы как-то визуализировать что происходит со стеком во время выполнения кода. Причем в простой форме, не читая асм

типа там стопка и по ней бегает указатель какой нить

Google
Dmitry
04.03.2018
13:04:27
Ну просто чтобы понимать как это происходит. Просто тут про разные подсчеты ссылок обсуждают и мне это не очень в голову ложится

Dmitry
04.03.2018
13:06:03
Ну а как происходит подсчет ссылок простыми словами? Как понимаю все объекты на которых нет ссылок в стеке удаляются?

Тут же про Ref-count в сборщике мусора выше говорили или там есть еще какие-то техники?

Evgeny
04.03.2018
13:08:32
Ну а как происходит подсчет ссылок простыми словами? Как понимаю все объекты на которых нет ссылок в стеке удаляются?
У каждого объекта есть счетчик ссылок. Работа происходит не с самими объектами, а с обертками-структурами. При копировании обертки счетчик увеличивается, при уничтожении - уменьшается. Если счетчик ссылок стал равен нулю, то удаляем и сам объект.

Dmitry
04.03.2018
13:09:12
Это ты технику работы сборщика мусора описываешь или есть какая-то другая?

Evgeny
04.03.2018
13:09:26
Я описываю технику работы RC.

Dmitry
04.03.2018
13:09:34
А какую роль тогда стек играет? Это просто очередь операций получается?

Evgeny
04.03.2018
13:09:46
А сборщик мусора - это более общее понятие.

Dmitry
04.03.2018
13:09:46
Я описываю технику работы RC.
эта техника может заменить GC?

Evgeny
04.03.2018
13:10:18
эта техника может заменить GC?
Да, это можно сказать, одна и з реализаций GC.

Dmitry
04.03.2018
13:10:33
В чем плюсы\минусы RC?

Evgeny
04.03.2018
13:10:39
Но у нее есть свои изъяны

В чем плюсы\минусы RC?
Плюсы - детерминированность уничтожения объектов. минусы - оверхед и возможные утечки если будут циклические ссылки.

А какую роль тогда стек играет? Это просто очередь операций получается?
Типа того. Вышла переменная из зоны видимости - уничтожилась.

Pavel
04.03.2018
13:13:28
У объектов на стеке время жизни детеминировано. Как только объект снимается со стека, или снимается содержащий его фрейм, он разрушается.

Google
Pavel
04.03.2018
13:14:02
зона видимости не связана со стеком

Evgeny
04.03.2018
13:15:01
а что такое "объект снимается со стека, или снимается содержащий его фрейм" если не выход из зоны видимости?

Время жизни объектов на стеке вполне себе связано с областью видимости, хотя, конечно, это разные вещи.

Pavel
04.03.2018
13:15:45
время жизни - да, стек - нет

Evgeny
04.03.2018
13:16:21
время жизни объектов на стеке - да.

Pavel
04.03.2018
13:16:59
в общем случае нет

Evgeny
04.03.2018
13:17:25
ну разве что в таком общем, что мы за пределы D вылезаем.

Pavel
04.03.2018
13:17:45
стек - это уже за пределами D

Evgeny
04.03.2018
13:18:06
ну, мы вроде как обсуждаем стек именно в D.

А так-то да, это детали реализации.

можно вместо стека, хоть облачное хранилище задействоать.

"стек" - это типа то, что не куча :)

Pavel
04.03.2018
13:19:58
Ну а область видимости - больше об именах чем о времени жизни.

Evgeny
04.03.2018
13:20:20
да, но оно тесно связано

Как минимум время жизни объекта должно полностью включать в себя зону видимости. Если так можно выразиться.

Dark
04.03.2018
13:22:57
Мне вот всегда было интересно, стек уничтожается на уровне кода при returne'е или на уровне процессора?

Igor
04.03.2018
13:23:23
В dip1000 подробно описано про видимость и время жизни

Dark
04.03.2018
13:24:03
Мы все помрем

Pavel
04.03.2018
13:25:41
Мне вот всегда было интересно, стек уничтожается на уровне кода при returne'е или на уровне процессора?
На уровне процессора только некоторые вещи футболятся системе. Обычно всё разруливается локальным кодом.

Evgeny
04.03.2018
13:26:03
стек - это уже за пределами D
кстати в доках D стек упоминается часто и густо. Так что не факт, что за пределами :)

Google
Pavel
04.03.2018
13:26:37
В разных системах стек организовывается по-своему.

Evgeny
04.03.2018
13:26:49
но это таки стек

Dark
04.03.2018
13:26:59
На уровне процессора только некоторые вещи футболятся системе. Обычно всё разруливается локальным кодом.
Т.е. мы до входа в функцию сохраняем указатель на стек самостоятельно, а потом восстанавлимаем? Made by yourself?

Pavel
04.03.2018
13:27:15
да

Dark
04.03.2018
13:28:29
Понятно. Хотя где он хранит - тот еще вопрос. Надо посмотреть, как в С это сделано

Pavel
04.03.2018
13:29:37
адрес возврата сохраняется на стеке

для остального только память и регистры

Компилятор может вообще упразднить вызовы некоторых функций.

Dark
04.03.2018
13:30:50
Ну еще параметры через стек, вроде

Pavel
04.03.2018
13:31:06
обычно да

Dark
04.03.2018
13:32:19
В смысле обычно? Первые 6 - через регистры, остальные через стек

Evgeny
04.03.2018
13:33:20
У D вообще есть вменяемый ABI?

Dark
04.03.2018
13:33:52
Вроде да

В доках есть пункт

Pavel
04.03.2018
13:34:01
https://ru.wikipedia.org/wiki/%D0%A1%D0%BE%D0%B3%D0%BB%D0%B0%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BE_%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%D0%B5

Dark
04.03.2018
13:34:05
ABI

Evgeny
04.03.2018
13:34:19
нашел https://dlang.org/spec/abi.html

Что-то не вижу там "Первые 6 - через регистры, остальные через стек"

Pavel
04.03.2018
13:36:22
https://en.wikipedia.org/wiki/Calling_convention - тут ещё веселее

Dark
04.03.2018
13:36:47

Страница 427 из 719