Size: a a a

2020 September 23

EG

Emmanuel Goldstein in pro.vim
Emmanuel Goldstein
Ну, generics dilemma говорит, что из
1. Наличия дженериков
2. Статической диспетчеризации
3. Быстрой компиляции
можно выбрать только два пункта.
О которой исходно шла речь
источник

EG

Emmanuel Goldstein in pro.vim
Го выбрал 2 + 3, поэтому код на го состоит из копипаста чуть менее, чем полностью
источник

G

GNU/Vsevolod in pro.vim
> Статической диспетчеризации
Это про статик диспатч?
источник

EG

Emmanuel Goldstein in pro.vim
GNU/Vsevolod
> Статической диспетчеризации
Это про статик диспатч?
Ну да.
источник

EG

Emmanuel Goldstein in pro.vim
В расте, кстати, можно opt in в dynamic dispatch и 1 + 3.
Хз как в плюсах
источник

G

GNU/Vsevolod in pro.vim
В расте начинается динамик диспатч, там где начинаются дин трейты
источник

EG

Emmanuel Goldstein in pro.vim
GNU/Vsevolod
В расте начинается динамик диспатч, там где начинаются дин трейты
Ну да. Код с динтрейтами компилируется гораздо быстрее, чем с дженериками.
источник

EG

Emmanuel Goldstein in pro.vim
Но работает (обычно) медленнее, потому что мы теряем второй пункт.
источник

G

GNU/Vsevolod in pro.vim
Emmanuel Goldstein
Ну да. Код с динтрейтами компилируется гораздо быстрее, чем с дженериками.
Но растет кол-во машинного кода. Не разобрался еще, почему, правда
источник

EG

Emmanuel Goldstein in pro.vim
GNU/Vsevolod
Но растет кол-во машинного кода. Не разобрался еще, почему, правда
Да нет, не обязательно растёт.
источник

EG

Emmanuel Goldstein in pro.vim
На каждый конкретный вызов метода машинного кода будет больше, потому что там появляется пара слоёв индирекции
источник

G

GNU/Vsevolod in pro.vim
Emmanuel Goldstein
Но работает (обычно) медленнее, потому что мы теряем второй пункт.
Это связанно с толстыи указателями?
источник

EG

Emmanuel Goldstein in pro.vim
Но суммарное количество может уменьшиться, потому что нужно будет инстанцировать только один вариант функции
источник

EG

Emmanuel Goldstein in pro.vim
GNU/Vsevolod
Это связанно с толстыи указателями?
Да. Указатели на dyn Trait занимают два размера указателя. Чтобы вызвать метод через динамик диспатч, нужно:
1. Прочитать указатель на vtable (первая часть толстого указателя)
2. Перейти по нему
3. Найти в vtable нужный метод
4. Вызвать его со второй частью толстого указателя
источник

EG

Emmanuel Goldstein in pro.vim
Для обычного вызова методов нужно просто сделать один call
источник

G

GNU/Vsevolod in pro.vim
Кстати, по памяти толстый указатель по идее лучше обычного (где на каждом инстансе отдельно втейбл)? В плане, когда у нас список чего-то, трейтового.
источник

EG

Emmanuel Goldstein in pro.vim
По памяти толстый указатель занимает 128 бит на нормальных системах, обычный указатель 64 бита.
источник

EG

Emmanuel Goldstein in pro.vim
А ещё нужно где-то хранить vtable
источник

G

GNU/Vsevolod in pro.vim
Emmanuel Goldstein
По памяти толстый указатель занимает 128 бит на нормальных системах, обычный указатель 64 бита.
Это да, но с обычным же втейбл на каджый обьект, а с толстым втейбл один, разве нет?
источник

EG

Emmanuel Goldstein in pro.vim
GNU/Vsevolod
Это да, но с обычным же втейбл на каджый обьект, а с толстым втейбл один, разве нет?
Нет, с обычным никакого vtable нет вообще, адрес вызываемой функции известен на этапе компиляции
источник