Re[45]: benchmark
От: pilgrim_ Россия  
Дата: 14.01.17 15:15
Оценка:
Здравствуйте, alex_public, Вы писали:

_>>>Но даже если говорить про прямой вызов, то как по твоему компилятор C# будет способен это сделать, если там всегда можно написать такой код (где B и C наследники A; а f — виртуальная функция, переопределённая в них):

_>>>
_>>>A a;
_>>>if(х) a=new B();
_>>>else a=new C();
_>>>a.f();
_>>>

_>>>Как по твоему компилятор сможет подставить здесь прямой вызов? )
_>>Ессно никак, и будет виртуальный вызов, так же как и в C++ я думаю, ведь это чисто полиморфный код, нет?

_>Конечно. Но нюанс в том, что подобный код не скомпилируется в C++.


Ну типа я в курсе , добавим для C++ к A звездочку, я так понял что ты предостаивл типа псевдокод похожтй на C#/java

_>Там у тебя или явно полиморфный объект (ссылка или указатель) или явно нет (обычная переменная и именно их большинство в нормальном коде). Так что в последнем случае компилятор может абсолютно гарантированно подставлять нужный вызов.


Тут тоже интересная тема, чем отличается для компилятора A a; a.f.();, от A* a; a->f(); , что сlang ,что gcc генерят в последнем случае косвенный вызов.

_>В отличие от C#, где любой объект может быть инициализирован экземпляром другого класса где-то выше по коду. И как по твоему решает это проблему компилятор C#? )


Никак, т.е влоб — полиморфно, так же ка и в C++
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.