У меня есть небольшой сегмент кода, который мне нужно оптимизировать. Тема 'A' создала boost shared_ptr для объекта кучи. Thread 'A' записывает shared_ptr в очередь с потоком. Thread 'B' читает shared_ptr, использует его, а затем уничтожает.Создайте псевдонимы для boost :: shared_ptr через ссылку
Интенсивное профилирование/тестирование доказывает, что копирование shared_ptr, входящее/выходящее из очереди и корректирующее количество ссылок, является дорогостоящим. Поэтому я хотел бы передать общий ptr в очередь через ссылку. Я также хотел бы использовать std :: move для перемещения shared_ptr в очередь, а не для создания нового shared_ptr (я знаю, что это приведет к аннулированию параметра shared_ptr, который был передан в очередь).
Все описанное прекрасно работает, пока я не смешаюсь в тире полиморфизма. Я не могу передать ref_ shared_ptr производному obj функции, ожидающей shared_ptr в базовый класс. Я сварил это до очень маленького среза, который разоблачает поведение, которое меня смущает.
#include <boost/shared_ptr.hpp>
class Base
{
};
class Derived : public Base
{
};
int main()
{
boost::shared_ptr<Derived> pDerived(new Derived()); // simple creation
boost::shared_ptr<Derived> &alias1 = pDerived; // works fine
const boost::shared_ptr<Base> &alias2 = pDerived; // also works fine
boost::shared_ptr<Base> &alias3 = pDerived; // compilation error
//native pointers
Derived *alias4 = pDerived.get(); //works
const Base *alias5 = pDerived.get(); //works
Base *alias6 = pDerived.get(); //works
//native references
Derived &alias7 = *pDerived; // works
const Base &alias8 = *pDerived; // works
Base &alias9 = *pDerived; // works
}
Я не понимаю, почему назначение alias2 это прекрасно, но присваивание alias3 дает ошибку компилятора. Может ли кто-нибудь объяснить это? Мне нужна функциональность, как пример alias3, и я не могу заставить ее работать.
'станд :: shared_ptr & alias3 = static_cast <станд :: shared_ptr > (pDerived);' –
user2296177
Вы также можете попробовать использовать подталкивания 'static_cast':' alias3 = повышение :: static_pointer_cast (pDerived); ' –
pingul
Как и в случае с Эйссой Н., приведение результатов приводит к ошибке компиляции: 'недопустимая инициализация неконстантной ссылки типа âboost :: shared_ptr & â из rvalue типа âboost :: shared_ptr â boost :: shared_ptr & alias3 = boost :: static_pointer_cast (pDerived); 'Даже если это сработало, создание временного объекта rval - именно то, чего я пытаюсь избежать по соображениям эффективности. –
njensen