
Maxim
29.08.2018
06:40:29
это явно написано в пункте 6 по ссылке, которую я привел

Ievgenii
29.08.2018
06:40:32
This rule does not apply to auto objects or objects destructed with destroy, as the destructor is not being run by the garbage collector, meaning all references are valid.
Тоже цитата с той ссылки

Google

Ievgenii
29.08.2018
06:43:14
А мы именно о этой ситуации и говорим
Прочитай выше

Maxim
29.08.2018
06:43:28
я про то и говорил, что если полагаться на GC, то можно огрести проблем
если удалять объекты руками, то их не будет)

Ievgenii
29.08.2018
06:43:45
Пункт 15.10
Путаешься в показаниях)

Maxim
29.08.2018
06:44:06
это финализатор по факту

Ievgenii
29.08.2018
06:44:19
А в чем отличие?

Maxim
29.08.2018
06:44:25
который при destroy будет как бы деструктором

Ievgenii
29.08.2018
06:45:06

Maxim
29.08.2018
06:45:13
финализатор вызывается сборщиком мусора перед тем, как память освободится

NullSanya
29.08.2018
06:45:38

Google

Maxim
29.08.2018
06:45:52
при этом сборщик мусора не гарантирует порядок вызова финализаторов

Ievgenii
29.08.2018
06:46:59
Так в чем отличие от деструктора?
https://ru.wikipedia.org/wiki/Деструктор
Дестру́ктор — специальный метод класса, служащий для деинициализации объекта (например освобождения памяти).
In object-oriented programming, a destructor (dtor) is a method which is automatically invoked when the object is destroyed
https://en.wikipedia.org/wiki/Destructor_(computer_programming)
Если ты для себя обрисовал какую-то разницу, хорошо, я не спорю. Но даже на официальном сайте (в документации) написано - это деструктор
И я с ними согласен
Это хэндлер (метод), который вызывается перед тем, как объект будет безвозвратно удален

Maxim
29.08.2018
06:50:28
и в этом методе, в контексте D и большинства других GC-языков, в общем случае небезопасно обращаться к внутренним структурам даных, которые управляются GC

Ievgenii
29.08.2018
06:50:59
Если объекты создавать что-то типа такого:
Pool!MyClass(many, param, init)
То можно сделать красивую обертку...

Maxim
29.08.2018
06:52:06
везде, где есть GC, да, поэтому обычно такие штуки называют финализаторами, но мы можем называть деструкторами)

Ievgenii
29.08.2018
06:52:23
Метод служит для того, чтобы специфично очистить объект, а не обращаться куда-то за чем-то

Maxim
29.08.2018
06:52:48
с чего вдруг что?

Ievgenii
29.08.2018
06:53:01
Не деструктор, а какой-то финализатор

Maxim
29.08.2018
06:53:09
https://ru.wikipedia.org/wiki/%D0%A4%D0%B8%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%82%D0%BE%D1%80
ну принято так

NullSanya
29.08.2018
06:53:48
У меня один вопрос: где в куске кода, который я кидал выше, может вызываться конструктор?

Google

NullSanya
29.08.2018
06:55:44
А, я как обычно забыл, что приватность по модулю

Ievgenii
29.08.2018
07:00:12
ыгы

NullSanya
29.08.2018
07:01:39
Но можно сделать миксин!
типа
struct Foo { ... }
mixin Poolable!Foo;

Ievgenii
29.08.2018
07:03:59
Да, снова мы приходим к тому, что при описании класса, его нужно специфично описывать

NullSanya
29.08.2018
07:04:16
Ну да
Но это проще, чем самому реализовывать

Ievgenii
29.08.2018
07:15:33

Maxim
29.08.2018
07:16:10
очень жаль)

Ievgenii
29.08.2018
07:16:12
Когда тогда он вызывается с твоей т. зрения?

Ievgenii
29.08.2018
07:16:20
Деструктор
А там размыто написанна разница
Если так рассуждать, то деструктор можно создать только самому
А не при помощи СМ

Maxim
29.08.2018
07:17:31
деструктор — это понятие из области ручного управления памятью

Ievgenii
29.08.2018
07:18:08
Хм...
Как частный случай финализатора...

Maxim
29.08.2018
07:18:27
грубо говоря, деструктором принято называть финализатор, момент вызова которого строго детерминирован)

Google

Maxim
29.08.2018
07:18:51
т.е. вот делаешь ты в C++ delete, вызывается деструктор
или в D выходит структура из области видимости, для нее вызывается деструктор

Karbin
29.08.2018
07:19:10
делаешь destroy, вызывается...

Ievgenii
29.08.2018
07:19:37

Maxim
29.08.2018
07:19:51
destroy вообще странная штука, она вызывает финализатор и обнуляет память объекта, но эта область остается зарезервированной в GC

Ievgenii
29.08.2018
07:20:14

Karbin
29.08.2018
07:20:23
да, это ручное. понятие деструктора и финализатора в D размыто

Ievgenii
29.08.2018
07:20:34
Слишком дорого память гонять туда-сюда, да еще и такими маленькими кусочками

Karbin
29.08.2018
07:21:20
вы последние 30 минут из-за названия спорите

Ievgenii
29.08.2018
07:21:23
Да, согласен. Значит финализатор.

Admin
ERROR: S client not available

Ievgenii
29.08.2018
07:21:34
"в споре рождается истина"

Maxim
29.08.2018
07:22:58
ну просто в D, если не гарантировать, что для объекта будет вызван destroy, нужно очень аккуратно использовать ~this

Karbin
29.08.2018
07:23:32
так же как и в шарпе

Maxim
29.08.2018
07:23:53
как и в любом другом известном мне GC языке)

Igor
29.08.2018
07:24:32
Уже ведь куча стратегий реализована в std.experimental.allocator. имхо там 90% случаев покрыто

Ievgenii
29.08.2018
07:25:36
Ну такое
Я предпочитаю использовать https://dlang.org/library/core/stdc/stdlib/malloc.html

Google

Ievgenii
29.08.2018
07:26:32
Чем "std.experimental"
А если что - потом и поменять не проблема

Igor
29.08.2018
07:27:38
Там просто уже много всего. И достаточно экзотические варианты есть

Ievgenii
29.08.2018
07:28:28
Ну...
Мне стремно использовать такой неймспейс)
Делаю небольшой тест
Замер вызова функций из *.SO
и простой ф-ции
./main 1 1000000000
3 secs, 748 ms, and 540 μs dl= 1000000000
2 secs, 361 ms, and 36 μs m1= 1000000000
2 secs, 307 ms, and 932 μs m2= 1000000000
первая строка - это вызов ф-ции из *.so
2я строка - это extern (C) uint m1()
3я строка - uint m2()
последнее число - количество вызовов
Это 1 миллиард вызовов
3 ms and 856 μs dl= 1000000
2 ms and 765 μs m1= 1000000
3 ms and 13 μs m2= 1000000
1 лям
В принципи, не так уж и много наклодных расходов
10 μs dl= 1000
3 μs m1= 1000
3 μs m2= 1000
6 μs dl= 1000
3 μs m1= 1000
3 μs m2= 1000
Согласен, тесты не честные, но все же...
Буду пробовать на *.so-ки выносить функционал

Toha
29.08.2018
13:51:07
Народ, а асинхронный код может работать в несколько потоков?

Pavel
29.08.2018
13:52:20
Конечно