Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.19.31.73] |
|
Страницы: (16) 1 2 [3] 4 5 ... 15 16 все ( Перейти к последнему сообщению ) |
Сообщ.
#31
,
|
|
|
Цитата D_KEY @ Для приведенного плюсового кода компилятор вполне может так же сгенерировать код без обращения к vtable. Мы не говорим о мудрости компайлеров. Тут чисто концептуально - динамическая диспетчеризация ═► косвенные вызовы. Да, компайлер в ряде случаев ваще может методы заинлайнить. Но разговор не об этом. Вот тут не отвечу предметно, ибо учусь. Но, сска, чуйка подсказывает профит ... Скрытый текст Хистори Практически - де жа вю. Было время, писал на Virtual Pascal, а продвинутые "боссы" гнобили, мол Дельфи - это наше все, модно и современно! А работа была по массовой обработке и трансформации текстов (нормативка). 1997 год. Просто сдуру взялся за Perl. Сперва просто плевался. Как меня только не высмеивали, qwerty-$%#$-птичий язык. Но и тогда БЫЛА ЧУЙКА!!! Через месяцок я пишу обработчик за пол-часа, макс. час - коллеги в пару дней не укладываются на своем Дельфэ. И тогда я понял, это не вселенская мудрость - это практическая чуйка. Надо ее слушать! Вот о5 че-то подмывает ... |
Сообщ.
#32
,
|
|
|
Стоп! В доках о трэйтах и трэйт-обектах я читал. Это не одно и то же! Более того, я вааще могу не создавать ни явных трэйтов, ни трэйт-объектов! А только реализацию. Но давайте не отвлекаться. Читаем и повторяем ... Это я чисто напомнить суть разговора, перевожу: "impl'ы всегда создают косвенные вызовы". |
Сообщ.
#33
,
|
|
|
Цитата JoeUser @ D_KEY, и да ... твой код не эквивалентен "растовскому"! Я сперва тоже приплел виртуальные функции, потом подумал, что на 3 структурах можно и без ни Посыпаю голову пепломъ В посте с кодом С++ и Rust - я привел первый вариант (с виртуальными функциями), а в ссылке на он-лайн компилятор - привел код без них! С++ вариант должен быть вот так, без виртуальных функций: #include <iostream> using namespace std; struct A { int a; A(int x); void print(); }; struct B : A { int b; B(int x, int y); void print(); }; struct C : B { int c; C(int x, int y, int z); void print(); }; A::A(int x):a(x) { } void A::print() { cout << a << endl; } B::B(int x, int y):A(x),b(y) { } void B::print() { A::print(); cout << b << endl; } C::C(int x, int y, int z):B(x,y),c(z) { } void C::print() { B::print(); cout << c << endl; } int main() { C c = {1,2,3}; c.print(); return 0; } Да, это мой косяк! |
Сообщ.
#34
,
|
|
|
Цитата JoeUser @ Это я чисто напомнить суть разговора, перевожу: "impl'ы всегда создают косвенные вызовы". Суть? А по-моему изначально суть была в самом наличии VMT Вообще, очевидно, зависит от конкретного сценария использования. Если ты юзаешь статическую диспетчеризацию, то компилятору нет смысла делать виртуальный вызов, и для этого даже оптимизатор не нужен. А вот создавать или нет VMT для конкретного типа (и именно об этом я говорил в прошлом своём комментарии) уже зависит только от оптимизатора. |
Сообщ.
#35
,
|
|
|
JoeUser, ты можешь поиграться на https://play.rust-lang.org/
Умеет выводить asm и llvm-ir |
Сообщ.
#36
,
|
|
|
Цитата OpenGL @ А вот создавать или нет VMT для конкретного типа (и именно об этом я говорил в прошлом своём комментарии) уже зависит только от оптимизатора. Я утверждаю - без динамической диспетчеризации VMT в Расте быть не должно! Ты ответил: Скрытый текст Такшта давай определяться Impl'ы - действительно тупые и всегда лепят VMT (или vtable), или ты решил внезапно "приукрасить" недопиленность Раста? Добавлено Цитата OpenGL @ А вот создавать или нет VMT для конкретного типа (и именно об этом я говорил в прошлом своём комментарии) уже зависит только от оптимизатора. чисто интерес !!! Покажи мне с Раст ну или С++ вариант, когда не используется динамическая диспетчеризация - но VMT па-любэ строятся! Я просто должен это увидеть!!! |
Сообщ.
#37
,
|
|
|
OpenGL, D_KEY, с вашего позволения, я немножко, промежуточно, резюмирую!
Де-юре, я не должен искать доказательства того, "что этого не может быть" или "не бывает". Так работает "презумпция невиновности" в доказательствах. Если вы утверждаете факт или свойство - вы и доказывайте. Примерами, доками, асм-кодом. Я же аппелирую к здравому смыслу. С++ этого не делает, и это состоявшийся язык. Rust - гораздо моложе, но имеет "базу", включая тот же C++", и свой некороткий путь развития. И не должен этого делать... А вдруг вы правы? Доказательства! |
Сообщ.
#38
,
|
|
|
Мне кажется, что есть какое-то недопонимание
|
Сообщ.
#39
,
|
|
|
Цитата JoeUser @ Покажи мне с Раст ну или С++ вариант, когда не используется динамическая диспетчеризация - но VMT па-любэ строятся! Я просто должен это увидеть!!! Тебя только что интересовало не наличие VMT, а есть виртуальный вызов или нет. Всё-таки теперь тебя уже VMT интересует? |
Сообщ.
#40
,
|
|
|
Цитата OpenGL @ Тебя только что интересовало не наличие VMT, а есть виртуальный вызов или нет Упс ... Чисто мое скромное имхо ... А как ты представляешь себе виртуальный вызов без VMT (ну или аналога)? Скрытый текст Дабы не был кривотолков. "Есть ли виртуальный вызов" и "наличие VMT" - для меня вопросы в принципе эквивалентные. Прямой вызов или косвенный. Просто трактовка разная. Цитата D_KEY @ Мне кажется, что есть какое-то недопонимание Все возможно, даже то - что быть не может Вощем ... проясняй, а я подтянусь! |
Сообщ.
#41
,
|
|
|
Цитата OpenGL @ Тебя только что интересовало не наличие VMT, а есть виртуальный вызов или нет. Всё-таки теперь тебя уже VMT интересует? Зы - ты плохой Дай линк на мой пост, где мне на VMT пофик и только виртуальные вызовы интересуют. |
Сообщ.
#42
,
|
|
|
Цитата JoeUser @ Прям-таки сходу не приведу, но опишу Плюсовый сценарий.Покажи мне с Раст ну или С++ вариант, когда не используется динамическая диспетчеризация - но VMT па-любэ строятся! Пишем шаблон класса с хотя бы одним виртуальными методом. Явно его инстанцируем каким-либо набором шаблонных параметров. Никуда компилятор не денется, ему придётся сынстанцировать все методы и построить VMT. При этом в программе может не быть ни одного виртуального вызова, но компилятор об этом знать не может. Впрочем, грамотный линкер сможет соптимизировать, но это будут его личные особенности. Вероятно, это не тот сценарий, который ты искал, JoeUser, однако вот он. В целом полиморфизм можно построить и руками на обычных указателях на функции, хоть и на С. Считать ли подобный велосипед за VMT, я не знаю. |
Сообщ.
#43
,
|
|
|
Цитата JoeUser @ Упс ... Чисто мое скромное имхо ... А как ты представляешь себе виртуальный вызов без VMT (ну или аналога)? Я затруднюсь представить, что тебя заставило представить, что я представляю виртуальный вызов без VMT (ну или аналога) Добавлено Цитата JoeUser @ Цитата OpenGL @ Тебя только что интересовало не наличие VMT, а есть виртуальный вызов или нет. Всё-таки теперь тебя уже VMT интересует? Зы - ты плохой Дай линк на мой пост, где мне на VMT пофик и только виртуальные вызовы интересуют. Блин, давай сначала. В коде, представленном тобой, а также в коде наподобие trait Foo { fn foo(); } fn call_foo<T: Foo>(a: T) { a.foo(); } я нахожу маловероятным то, что компилятор вставит в них виртуальный вызов потому что в нём компилятор знает исходный тип элементов. При этом вопрос наличия VMT у типа, имплементящего это самое Foo, совершенно ортогонален первому - очевидо, она будет если ты юзаешь виртуальные вызовы, а если нет, то её наличие - вопрос исключительно оптимизатора, и ответ я на него не знаю, так что разберись уж как-нибудь сам с ним (ссылки на онлайн-дизассемблер раста кидали выше), раз уж для тебя это настолько важно, что ты готов "забыть про раст" (с) ежели что не так |
Сообщ.
#44
,
|
|
|
Цитата Qraizer @ хотя бы одним виртуальными методом. Если компайлер "агрицца" на виртуальный метот неразвернутого шаблона - это плохой компайлер! ИМХО, он должен сперва развернуть все, и только потом - строит код. Низачот! Add: ЗЫ: Хотя ... В нынешней реализации - ты скорее прав! Если бы развертка шаблонов была шагом а-ля "пост-пре-процессор" - да, можно было бы на компилятор ругаться. А пока - только на линкер надежда, что он "склеит", а что выкинет. |
Сообщ.
#45
,
|
|
|
Цитата OpenGL @ то её наличие - вопрос исключительно оптимизатора - извини за мой французский ... не оптимизатора - а говнятора! зачем деспетчировать функции, которые в этом не нуждаются?! Это вопрос оптимизатора? Цитата OpenGL @ так что разберись уж как-нибудь сам с ним А-я-яй!!! Это пост в стиле "сетьлера"© - типа я задекларирую Цитата OpenGL @ что ты готов "забыть про раст" Вестись на слабо - это прекрасно! Цитата OpenGL @ я нахожу маловероятным то, что компилятор вставит в них виртуальный вызов потому что в нём компилятор знает исходный тип элементов И я нахожу это! А "они" - нет |