Re[14]: Java vs C# vs C++
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 02.10.15 13:35
Оценка: -1
Здравствуйте, 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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.