Re[45]: «Собаку съел»
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 19.01.17 16:45
Оценка:
Здравствуйте, samius, Вы писали:

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


S>> Так параметрический полиморфизм хорошь в том, что он инлайнится.

S>> Я привожу тебе примеры где Дженерики прекрасно инлайнятся. Но при этом получаем проверку типа и интеллисенсе.

S>Вы все еще об этом примере?


S>
S>return arr.Where(x => x > q).Select(x => x + 3).Sum();
S>


S>Если да, то в нем предикат и проекция записаны изначально в виде, не относящемся к параметрическому полиморфизму. "x > q" и "x + 3" здесь используют ad-hoc полиморфизм. Это один момент. Второй — инлайнятся Func-и, но не операторы. Вот если бы изначально было записано

S>
S>x => SomeGenericComparer.Compare(x, q) > 0
S>

S>подозреваая что метод Compare<T> дженериковый; компилятор выводит T, и после оптимизации мы увидели бы "x > q", то да!

В свое время VladD2 на висби еже дела тест при компараторе на структуре и тогда они инлайнили компаратор. Но затем решили, что это не нужно.
То есть если компаратор заранее известен, то и проинлайнить как это делается в C++ с шаблонами.
Но нужно это только для валуе типов.
В большинстве же случаев ты будешь использовать линк

arr.Where(x => x > q).Select(x => x + 3).Sum();


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