Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, Serginio1, Вы писали:
EP>>>>>Здесь внутри foo, ещё до всяких оптимизаторов, известен и конкретный тип замыкания F, и его размер, и конкретный вызываемый метод.
EP>>>>>Аналог на C# в студию
S>>>>S>>>> T foo<T>(Func<T> f)
S>>>>{
S>>>> return f();
S>>>>}
S>>>>
EP>>>О чём и речь — у тебя внутри foo один тип для разных замыканий с одинаковой сигнатурой — а значит динамический полиморфизм и прочие индерекции, которые на порядок сложнее оптимизировать
S>> На данном этапе да.
S>>Но мы то говорим о компиляторе в стиле C++. А там return x>>
проинлайнить не проблема на уровне исходников.
EP>Подобные штуки (динамический полиморфизм) и компиляторы C++ инлайнят только в простейших вариантах — если же добавить простую аллокацию на пути или что-то подобное, то это становится серьёзным барьером для инлайнинга (тут разве что помогает PGO, да и то частично).
EP>То есть ещё раз, код C# чисто по построению намного труднее оптимизировать — для оптимизаций до уровней аналогичных C++ нужно либо язык модифицировать, либо делать оптимизаторы намного более мощные чем оптимизаторы C++
А можно поподробнее чем
T foo<T>(Func<T> f)
{
return f();
}
Принципиально отличается
template<typename F>
auto foo(F f)
{
return f();
}
И почему для C++ проще занматься оптимизацией? T4 работают, а создать генератор кода на дженериках тоже не огромная проблема. Да для кое где нужно что то добавить в язык для более удобного использования ограничений. Но это небольшие нововведения.