Здравствуйте, gandjustas, Вы писали:
G>>>Специально для тебя повторю — замедляющих факторов полно в любом языке. Даже в С++ (одни смартпоинтеры чего стоят).
V>>Сами смарт-поинтеры ничего не стоят. Они не делают никакой лишней работы, которая не была бы сделана "ручками" в их отсутствие.
G>Ты о smart_ptr или о какой-то магии?
Я довольно точно выразил свою мысль.
Смарт-поинтеры — это лишь элемент автоматизации имеющейся функциональности, а не привнесения новой.
Например, взять COM-объекты и какой-нить _com_ptr_t — абсолютно никаких дополнительных телодвижения этот _com_ptr_t не привнесет по сравнению с ситуацией, когда аналогичный код пишется без смарт-поинтеров (как в Паскале, например).
Такая же ситуация с другими смарт-поинтерами со счетчиками владения, типа intrusive_ptr.
Или без счетчиков, типа unique_ptr/auto_ptr.
G>>>Так вот Java умеет девиртуализировать вызовы
V>>Плюсы всегда девиртуализируют вызовы, когда известен точный тип объекта. Умели это еще до джавы.
G>"Всегда" это сколько по времени? Когда я занимался C++ в далеком 2006 не было девиртуализации в Visual Studio.
Ну вот так хорошо ты занимался.
struct A {
virtual void m() {
std::cout << "A";
}
};
struct B : A {
virtual void m() {
std::cout << "B";
A::m();
}
};
int main(int argc, char* argv[])
{
B b;
b.m();
return 0;
}
В дебажной-сборке вызывается без виртуализации по обычному call с прямой адресацией:
b.m();
00E15F90 lea ecx,[b]
00E15F93 call B::m (0E11159h)
В релизной инлайнится нафик и тело B::m и A::m. Инлайнится строго по той причине, что никакого виртуального вызова не происходит.