Я не знаю, почему MSVC не компилирует ваши сценарии "Case 2" для прямых вызовов - это, безусловно, возможно.Я думаю, что только Microsoft сможет ответить.
Обратите внимание, что GCC выполняет оптимизацию, которую вы ищете (протестировано с MinGW 4.5.1 и -O2
).
ТакжеMSVC использовала диспетчеризацию vtable даже для следующей последовательности (для ясности - я использую опцию оптимизации /Ox
):
A a;
A& ar(a);
ar.f();
Так что нет необходимости в функции или структуре контейнера для добавления слоев потенциалапутаница с компилятором - нет причины, по которой компилятор не может обрабатывать ar.f()
точно так же, как a.f()
в этой последовательности.Но, как предположил Бо Перссон, возможно, это не очень распространенный сценарий оптимизации (или MS просто не добралась до него).Снова, только разработчики компилятора в MS могли ответить.
Я не уверен, что классифицировал бы это поведение как «странное», хотя - это возможность оптимизации, которая упущена, и все.Я не уверен, насколько распространенными могут быть такие вещи.Стоит ли ожидать, что компилятор будет генерировать статически связанные вызовы в этом случае?Может быть.Но я думаю, что не слишком удивительно, что этого не происходит.
Может быть, проблема должна быть открыта в MS Connect.