Сообщение Re[46]: benchmark от 14.01.2017 15:30
Изменено 14.01.2017 15:31 Evgeny.Panasyuk
Re[46]: benchmark
Здравствуйте, pilgrim_, Вы писали:
_>>Там у тебя или явно полиморфный объект (ссылка или указатель) или явно нет (обычная переменная и именно их большинство в нормальном коде). Так что в последнем случае компилятор может абсолютно гарантированно подставлять нужный вызов.
_>Тут тоже интересная тема, чем отличается для компилятора A a; a.f.();, от A* a; a->f(); , что сlang ,что gcc генерят в последнем случае косвенный вызов.
В последнем случае вообще UB.
А вот такой вызов A* a = new A; a->f() — вполне инлайнится, и даже вот такой auto x = std::make_shared<A>(); x->f();
_>>В отличие от C#, где любой объект может быть инициализирован экземпляром другого класса где-то выше по коду. И как по твоему решает это проблему компилятор C#? )
_>Никак, т.е влоб — полиморфно, так же ка и в C++
Если объявление вида A x;, то вызов x.virtual_method() без проблем инлайнится
_>>Там у тебя или явно полиморфный объект (ссылка или указатель) или явно нет (обычная переменная и именно их большинство в нормальном коде). Так что в последнем случае компилятор может абсолютно гарантированно подставлять нужный вызов.
_>Тут тоже интересная тема, чем отличается для компилятора A a; a.f.();, от A* a; a->f(); , что сlang ,что gcc генерят в последнем случае косвенный вызов.
В последнем случае вообще UB.
А вот такой вызов A* a = new A; a->f() — вполне инлайнится, и даже вот такой auto x = std::make_shared<A>(); x->f();
_>>В отличие от C#, где любой объект может быть инициализирован экземпляром другого класса где-то выше по коду. И как по твоему решает это проблему компилятор C#? )
_>Никак, т.е влоб — полиморфно, так же ка и в C++
Если объявление вида A x;, то вызов x.virtual_method() без проблем инлайнится
Re[46]: benchmark
Здравствуйте, pilgrim_, Вы писали:
_>>Там у тебя или явно полиморфный объект (ссылка или указатель) или явно нет (обычная переменная и именно их большинство в нормальном коде). Так что в последнем случае компилятор может абсолютно гарантированно подставлять нужный вызов.
_>Тут тоже интересная тема, чем отличается для компилятора A a; a.f.();, от A* a; a->f(); , что сlang ,что gcc генерят в последнем случае косвенный вызов.
В последнем случае вообще UB.
А вот такой вызов A* a = new A; a->f() — вполне инлайнится, и даже вот такой auto x = std::make_shared<A>(); x->f();
_>>В отличие от C#, где любой объект может быть инициализирован экземпляром другого класса где-то выше по коду. И как по твоему решает это проблему компилятор C#? )
_>Никак, т.е влоб — полиморфно, так же ка и в C++
Если объявление вида A x;, то вызов x.virtual_method() без проблем инлайнится, даже если находится где-то очень "далеко"
_>>Там у тебя или явно полиморфный объект (ссылка или указатель) или явно нет (обычная переменная и именно их большинство в нормальном коде). Так что в последнем случае компилятор может абсолютно гарантированно подставлять нужный вызов.
_>Тут тоже интересная тема, чем отличается для компилятора A a; a.f.();, от A* a; a->f(); , что сlang ,что gcc генерят в последнем случае косвенный вызов.
В последнем случае вообще UB.
А вот такой вызов A* a = new A; a->f() — вполне инлайнится, и даже вот такой auto x = std::make_shared<A>(); x->f();
_>>В отличие от C#, где любой объект может быть инициализирован экземпляром другого класса где-то выше по коду. И как по твоему решает это проблему компилятор C#? )
_>Никак, т.е влоб — полиморфно, так же ка и в C++
Если объявление вида A x;, то вызов x.virtual_method() без проблем инлайнится, даже если находится где-то очень "далеко"