Re[13]: Java vs C# vs C++
От: vdimas Россия  
Дата: 02.10.15 10:51
Оценка: +1 -1
Здравствуйте, 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. Инлайнится строго по той причине, что никакого виртуального вызова не происходит.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.