Сообщение 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>:
Для какой надобности?
G>Зато гарантированно не будет обращения к освобожденной памяти.
G>Девиртуализация вызовов это когда из кода:
G>
G>Компилируется вызов b.m() без использования VMT.
Для виртуализации необходимо изменение тела ф-ии под конкретный подаваемый тип. Это происходит при инлайнинге, например.
Никаких проблем:
Прекрасно обходимся без виртуального вызова.
Я же говорю, необходимо лишь, чтобы компилятор достоверно знал тип объекта.
Когда твоя джава получит указатель на объект "откуда-то еще", никакой девиртуализации при вызове не происходит, оно происходит аккурат в аналогичном приведенному сценарии.
Причем, для С++ это работает и в случае вложенных друг в друга объектах:
А в случае Джавы — уже дудки.
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>:
Для какой надобности?
G>Зато гарантированно не будет обращения к освобожденной памяти.
G>Девиртуализация вызовов это когда из кода:
G>
G>Компилируется вызов b.m() без использования VMT.
Для девиртуализации необходимо изменение тела ф-ии под конкретный подаваемый тип. Это происходит при инлайнинге, например.
Никаких проблем:
Прекрасно обходимся без виртуального вызова.
Я же говорю, необходимо лишь, чтобы компилятор достоверно знал тип объекта.
Когда твоя джава получит указатель на объект "откуда-то еще", никакой девиртуализации при вызове не происходит, оно происходит аккурат в аналогичном приведенному сценарии.
Причем, для С++ это работает и в случае вложенных друг в друга объектах:
А в случае Джавы — уже дудки.
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;
}
А в случае Джавы — уже дудки.