Я не удивлюсь, если большинство компиляторов C ++ выполнят такую оптимизацию, по крайней мере, некоторые ее варианты.На самом деле это очень зависит от языка и компилятора.
Я не могу говорить для языка D, но для C / C ++ вышеописанный тип оптимизации может быть сложным из-за арифметики указателей.Например, можете ли вы оптимизировать код, если он похож на этот?
++myDelegate;
myDelegate();
Это так сильно зависит от типа myDelegate
.Вышеприведенное может быть допустимым C / C ++, но встраивание myDelegate () может быть не тем, что может гарантировать компилятор.
Другие языки (например, Java, C # и т. Д.) Не имеют арифметику указателей, поэтому болеепредположения могут быть сделаны.Например, Sun JVM может преобразовывать косвенные полиморфные вызовы в прямые, что довольно круто, ИМХО.Пример:
public class A2 {
private final B2 b;
public A2(B2 b) {
this.b = b;
}
public void run() {
b.f();
}
}
public interface B2 {
public void f();
}
public class C2 implements B2 {
public void f() {
}
}
A2 a2 = new A2(new C2());
действительно может быть оптимизирован, и Sun JVM может это подхватить.
Я получил этот пример из новостной рассылки Java Specialists 157 , который я рекомендую прочитать, чтобы узнать о таких вещах WRT Java.