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