static_cast накладные расходы на базовый класс и член этого класса

У меня есть эти классы:

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&()

Я не могу понять, что является накладными расходами времени выполнения приведенных выше выражений. Я думаю, что компилятор может легко оптимизировать это, но всегда ли он это делает?

В первом случае я просто указываю на базовый класс, поэтому я думаю, что нет никаких накладных расходов (возможно, компилятор может добавить некоторое смещение к указателю), но в других у меня нет единого представления о том, что на самом деле происходит.


person Liuka    schedule 31.08.2015    source источник
comment
Почему вы считаете, что должны быть накладные расходы во время выполнения? static_cast разрешается во время компиляции.   -  person πάντα ῥεῖ    schedule 31.08.2015
comment
stackoverflow.com/questions/6445841/   -  person Liuka    schedule 31.08.2015
comment
Посмотрите на комментарии под ответом: Вы отбрасываете указатели. Копия указателя (которая в любом случае может быть оптимизирована компилятором) является незначительной операцией. Я бы не стал его оптимизировать   -  person πάντα ῥεῖ    schedule 31.08.2015
comment
ptr_a = &static_cast<A>(*ptr_c); //calls B::operator A*&()Это не компилируется, чего вы пытаетесь добиться этим?   -  person Drax    schedule 31.08.2015
comment
Пожалуйста, спросите о каком-нибудь коде, который действительно компилируется.   -  person molbdnilo    schedule 31.08.2015
comment
@ πάντα: само приведение не требует дополнительных затрат времени выполнения, преобразование, запускаемое этим приведением, может, особенно в случаях пользовательских операторов преобразования.   -  person MikeMB    schedule 31.08.2015
comment
извините, я написал неправильный код, теперь все в порядке   -  person Liuka    schedule 31.08.2015
comment
класс C — это ресурс со счетчиком ссылок. Я хочу иметь возможность назначать ptr типа C одному из типов A или B и в любом случае увеличивать счетчик ссылок. Конечно, это не необработанные указатели, а какой-то дескриптор с операцией шаблона, могу ли я опубликовать весь код?   -  person Liuka    schedule 31.08.2015
comment
@ πάνταῥεῖ Я знаю, что выполняю приведение типов между указателями, но во втором присваивании я сначала разыменовываю указатель, а затем вызываю оператор преобразования. Будет ли это оптимизировано?   -  person Liuka    schedule 31.08.2015
comment
@Liuka Как уже упоминалось, ptr_a = static_cast<A*>(*ptr_c); не компилируется. Если это так, вам понадобится что-то вроде ptr_a = &static_cast<A&>(*ptr_c); . И это было бы оптимизировано, да.   -  person πάντα ῥεῖ    schedule 31.08.2015
comment
@πάνταῥεῖ на Microsoft Visual Studio 2015 скомпилирован правильно   -  person Liuka    schedule 31.08.2015
comment
вопрос отредактирован с другим случаем для целей обучения   -  person Liuka    schedule 31.08.2015