Да, хотя это незначительно.
В этом случае приведение в стиле C интерпретируется как static_cast
, что может привести к корректировке указателя.
struct Base {};
struct Derived: Base { virtual ~Derived(); } // note: introduced a virtual method
int main()
{
Derived derived;
Base* b = &derived;
Derived* d = (Derived*) b;
void* pb = b;
void* pd = d;
printf("%p %p", pb, pd);
return 0;
}
Это накладные расходы происходят, когда базовый подобъект не выровнен по тому же адресу, что и производный объект, что происходит, когда:
- Представляем первый виртуальный метод
- с использованием мульти-наследования
Конечно, корректировка указателя обычно считается пренебрежимо малой, и компилятор должен быть достаточно умен, чтобы устранить ее, если она все равно не нужна (настройка 0).
Примечание: это зависит от реализации, а не предписано стандартом