Size: a a a

2020 June 29

АР

Андрей Руссков... in pro.cxx
вообще мне кажется что в с++ можно притянуть почти любую концепцию из почти любого языка, вопрос лишь в том, зачем?
источник

m

magras in pro.cxx
Андрей Руссков
ну рантайм полиморфизм раста делается через виртуальные классы, тут как бы вообще пофиг
м? Там vtable вынесен из класса в указатель. То есть указатель на котором возможен runtime полиморфизм в расте представляет из себя struct { T* obj; void* vtbl; };.
источник

АР

Андрей Руссков... in pro.cxx
и... какой именно профит это дает?
источник

АР

Андрей Руссков... in pro.cxx
точнее "мне кажется или я могу доказать что на самом деле это медленнее?"
источник

m

magras in pro.cxx
Андрей Руссков
точнее "мне кажется или я могу доказать что на самом деле это медленнее?"
Это сложно оценить по скорости. Из преимуществ vtable оказывается в той же кеш линии, что указатель на структуру. Другими словами на один уровень индирекции меньше.

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

АР

Андрей Руссков... in pro.cxx
погоди
источник

АР

Андрей Руссков... in pro.cxx
у тебя есть указатель на vtable и есть смещение конкретного класса внутри vtable, верно?
источник

m

magras in pro.cxx
Ну а на сколько я вижу, главное преимущество в том, что одна структура может реализовывать любое количество трейтов. И автор структуры не обязан знать что либо о трейтах, которые повесит пользователь на его структуру.
источник

АР

Андрей Руссков... in pro.cxx
а в с++ это сразу указатель со смещением
источник

АР

Андрей Руссков... in pro.cxx
в случае с рантайм полиморфизмом это а-ля "создать интерфейс для класса не меняя класс?"
источник

АР

Андрей Руссков... in pro.cxx
но автор структуры всё равно обязан прописать все трейты которым она удовлетворяет, верно?
источник

m

magras in pro.cxx
Андрей Руссков
у тебя есть указатель на vtable и есть смещение конкретного класса внутри vtable, верно?
Я не уверен, что у нас одинаковое представление о vtable. В моем представлении это указатель на массив функций. То есть использование выглядит как-то так: vtable[index_of_function_foo](p); - это вызов p->foo();.
источник

m

magras in pro.cxx
Андрей Руссков
но автор структуры всё равно обязан прописать все трейты которым она удовлетворяет, верно?
Нет.
источник

АР

Андрей Руссков... in pro.cxx
magras
Я не уверен, что у нас одинаковое представление о vtable. В моем представлении это указатель на массив функций. То есть использование выглядит как-то так: vtable[index_of_function_foo](p); - это вызов p->foo();.
а как это будет работать если ты не знаешь тип значения по указателю p?
источник

m

magras in pro.cxx
Андрей Руссков
а как это будет работать если ты не знаешь тип значения по указателю p?
vtable указывает на разные массивы для разных типов.
источник

АР

Андрей Руссков... in pro.cxx
то есть в расте рантайм полиморфизм заключается в том, что вместо того чтобы положить vtable вместе с данными класса, он кладется в отдельную структуру, и в дальнейшем ты таскаешь её вместе с инстансом?
источник

m

magras in pro.cxx
Андрей Руссков
то есть в расте рантайм полиморфизм заключается в том, что вместо того чтобы положить vtable вместе с данными класса, он кладется в отдельную структуру, и в дальнейшем ты таскаешь её вместе с инстансом?
По сути да. Но вообще рантайм полиморфизм сейчас не часто применяется и обычно ты просто кладешь такие указатели в вектор. и больше нигде не таскаешь. Собственно у меня не такой большой опыт использования раста, но я еще ни разу не использовал рантайм полиморфизм. Так что можно сказать, что хранение vtable в классе может быть не zero cost abstraction.
источник

АР

Андрей Руссков... in pro.cxx
рантайм полиморфизм в принципе не может быть zero cost abstraction
источник

АР

Андрей Руссков... in pro.cxx
btw, если ты используешь паттерн матчинг вместо рантайм полиморфизма, это то плюс минус же самое, только на один уровень абстракции ниже и в целом должно было бы быть менее удобно*
источник

АР

Андрей Руссков... in pro.cxx
*если бы не приходилось таскать указатель на vtable вместе с инстансом
источник