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

_>>Я имел в виду как раз инлайнинг, точнее его потенциальную возможность (а осуществлять его или нет компилятор решает сам в зависимости от вида функции — для мелких можно считать гарантированно заинлайнит).

_>Ну т.е. я тебя правильно понял и речь была о замене косвенного вызова (виртуального) на прямой?

Ну да. Просто в C++ вслед за этой заменой в большинстве случаев последует и инлайнинг.

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

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

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

Конечно. Но нюанс в том, что подобный код не скомпилируется в C++. Там у тебя или явно полиморфный объект (ссылка или указатель) или явно нет (обычная переменная и именно их большинство в нормальном коде). Так что в последнем случае компилятор может абсолютно гарантированно подставлять нужный вызов. В отличие от C#, где любой объект может быть инициализирован экземпляром другого класса где-то выше по коду. И как по твоему решает это проблему компилятор C#? )
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.