У меня есть эти классы:
class A{};
class B
{
public:
A* ptr_obj;
A obj;
operator A*&()
{
return ptr_obj;
}
operator A&()
{
return obj;
}
};
class C : public B {};
Теперь у меня есть указатель на объект типа C
C* ptr_c;
И два других указателя, один типа B и один типа A.
B* ptr_b;
A* ptr_a;
Я хочу привести ptr_c и назначить его ptr_a и ptr_b:
ptr_b = static_cast<B*>(ptr_c);
ptr_a = static_cast<A*>(*ptr_c); //calls B::operator A*&()
ptr_a = &static_cast<A>(*ptr_c); //calls B::operator A&()
Я не могу понять, что является накладными расходами времени выполнения приведенных выше выражений. Я думаю, что компилятор может легко оптимизировать это, но всегда ли он это делает?
В первом случае я просто указываю на базовый класс, поэтому я думаю, что нет никаких накладных расходов (возможно, компилятор может добавить некоторое смещение к указателю), но в других у меня нет единого представления о том, что на самом деле происходит.
static_cast
разрешается во время компиляции. - person πάντα ῥεῖ   schedule 31.08.2015ptr_a = &static_cast<A>(*ptr_c); //calls B::operator A*&()
Это не компилируется, чего вы пытаетесь добиться этим? - person Drax   schedule 31.08.2015ptr_a = static_cast<A*>(*ptr_c);
не компилируется. Если это так, вам понадобится что-то вродеptr_a = &static_cast<A&>(*ptr_c);
. И это было бы оптимизировано, да. - person πάντα ῥεῖ   schedule 31.08.2015