Информация об изменениях

Сообщение Re[15]: Java vs C# vs C++ от 02.10.2015 16:25

Изменено 02.10.2015 16:53 vdimas

Здравствуйте, gandjustas, Вы писали:

G>То есть нечто в C++ делает подсчет ссылок без smart_ptr? Что это?


Это методы, навроде addRef/release.

V>>Например, взять COM-объекты и какой-нить _com_ptr_t — абсолютно никаких дополнительных телодвижения этот _com_ptr_t не привнесет по сравнению с ситуацией, когда аналогичный код пишется без смарт-поинтеров (как в Паскале, например).

G>COM имеет подсчет ссылок независимо от C++.

COM-технология зиждется на таблице виртуальных ф-ий, генерённых компилятором С++.
Никакой "независимости" тут нет.

G>Ты дурачка включил чтоли?


началось...

G>Без умных указателей везде будут передаваться T*.


У меня и с умными указателями везде передаётся T*, и?


G>А если мы все T* заменим на smart_ptr<T>, то подсчет ссылок сожрет производительность.


Если у тебя везде передавался smart_ptr<T> в бытность твою плюсовиком, то прими мои поздравления с... да много с чем... ))

Скажи, зачем вот сюда подавать smart_ptr<T>:
void process(T * data) {
  process1(data);
  process2(data);
  process3(data);
  process4(data);
  process5(data);
}


Для какой надобности?

G>Зато гарантированно не будет обращения к освобожденной памяти.


G>Девиртуализация вызовов это когда из кода:


G>
...
G>void f(A* a)
G>{
    a->>m();
G>}
...
G>


G>Компилируется вызов b.m() без использования VMT.


Для виртуализации необходимо изменение тела ф-ии под конкретный подаваемый тип. Это происходит при инлайнинге, например.

Никаких проблем:
int main(int argc, _TCHAR* argv[]) 
{
    B b;
    f(&b);
    return 0;
}


Прекрасно обходимся без виртуального вызова.
Я же говорю, необходимо лишь, чтобы компилятор достоверно знал тип объекта.

Когда твоя джава получит указатель на объект "откуда-то еще", никакой девиртуализации при вызове не происходит, оно происходит аккурат в аналогичном приведенному сценарии.

Причем, для С++ это работает и в случае вложенных друг в друга объектах:
struct C {
    B b;
};

int main(int argc, _TCHAR* argv[]) 
{
    C c;
    f(&c.b);

    return 0;
}


А в случае Джавы — уже дудки.
Re[15]: Java vs C# vs C++
Здравствуйте, gandjustas, Вы писали:

G>То есть нечто в C++ делает подсчет ссылок без smart_ptr? Что это?


Это методы, навроде addRef/release.

V>>Например, взять COM-объекты и какой-нить _com_ptr_t — абсолютно никаких дополнительных телодвижения этот _com_ptr_t не привнесет по сравнению с ситуацией, когда аналогичный код пишется без смарт-поинтеров (как в Паскале, например).

G>COM имеет подсчет ссылок независимо от C++.

COM-технология зиждется на таблице виртуальных ф-ий, генерённых компилятором С++.
Никакой "независимости" тут нет.

G>Ты дурачка включил чтоли?


началось...

G>Без умных указателей везде будут передаваться T*.


У меня и с умными указателями везде передаётся T*, и?


G>А если мы все T* заменим на smart_ptr<T>, то подсчет ссылок сожрет производительность.


Если у тебя везде передавался smart_ptr<T> в бытность твою плюсовиком, то прими мои поздравления с... да много с чем... ))

Скажи, зачем вот сюда подавать smart_ptr<T>:
void process(T * data) {
  process1(data);
  process2(data);
  process3(data);
  process4(data);
  process5(data);
}


Для какой надобности?

G>Зато гарантированно не будет обращения к освобожденной памяти.


G>Девиртуализация вызовов это когда из кода:


G>
...
G>void f(A* a)
G>{
    a->>m();
G>}
...
G>


G>Компилируется вызов b.m() без использования VMT.


Для девиртуализации необходимо изменение тела ф-ии под конкретный подаваемый тип. Это происходит при инлайнинге, например.

Никаких проблем:
int main(int argc, _TCHAR* argv[]) 
{
    B b;
    f(&b);
    return 0;
}


Прекрасно обходимся без виртуального вызова.
Я же говорю, необходимо лишь, чтобы компилятор достоверно знал тип объекта.

Когда твоя джава получит указатель на объект "откуда-то еще", никакой девиртуализации при вызове не происходит, оно происходит аккурат в аналогичном приведенному сценарии.

Причем, для С++ это работает и в случае вложенных друг в друга объектах:
struct C {
    B b;
};

int main(int argc, _TCHAR* argv[]) 
{
    C c;
    f(&c.b);

    return 0;
}


А в случае Джавы — уже дудки.