Виртуальная таблица С++

Возможный дубликат:
Проходит ли вызов виртуальной функции C++ для производного объекта через vtable?

У меня есть вопрос относительно виртуальной таблицы С++, особенно для gcc. рассмотрите следующий код

class A{
public:
virtual void doSomething(){}

}

class B : public A{
public:
virtual void doSomething(){}
}

//1 

A* a = new A()
a->doSomething();

Теперь вопрос в том, что, поскольку указатель a указывает на объект A, компилятор когда-либо утруждает себя поиском в виртуальной функции или он достаточно умен, чтобы решить эту проблему и избавиться от дерьма с виртуальной таблицей?

Благодарность


person user424060    schedule 30.12.2012    source источник
comment
Не мой -1, но проверка сгенерированного кода сборки - единственный надежный способ ответить на ваш вопрос, и вы можете легко сделать это самостоятельно. Практически это не должно иметь значения, как вы пишете свой код.   -  person Alok Save    schedule 30.12.2012
comment
Я упомянул рассматриваемый компилятор, gcc   -  person user424060    schedule 30.12.2012
comment
Если вы знаете, что динамический тип объекта — A, как в таком вырожденном случае, вы можете просто сами вызвать правильный метод: a->A::doSomething();   -  person StoryTeller - Unslander Monica    schedule 30.12.2012
comment
Недопустимо иметь оператор выражения в области пространства имен. Даже если бы это было так, предположим, что конструктор A изменил указатель a? Компилятор не может предположить, что этого не произойдет.   -  person CB Bailey    schedule 30.12.2012
comment
Обратите внимание, что правильный ответ там не принятый, а этот -› stackoverflow.com/a/4464163/673730 ( копия @Mat)   -  person Luchian Grigore    schedule 30.12.2012
comment
Недостаточно знать, что это gcc, это также, вероятно, зависит от версии компилятора. Оптимизации не стандартные, поэтому могут появиться (и даже уйти) на любой версии. Единственный реальный способ выяснить, действительно ли ваша версия - это посмотреть на сгенерированную ею сборку с разными флагами оптимизации (если только вы на самом деле не работаете с gcc и не знаете точного ответа).   -  person hyde    schedule 30.12.2012
comment
@CharlesBailey, но изменение указателя this будет UB, не так ли?   -  person Lol4t0    schedule 30.12.2012
comment
@ Lol3t0: this - это значение r, поэтому его нельзя изменить. Однако это не означает, что конструктор A может изменить значение a.   -  person CB Bailey    schedule 30.12.2012