Pergunta

Existe uma coleção, que está ciente dos internos shared_ptr e evita cópia regular de elementos armazenados shared_ptr em favor de apenas copiar seu ponteiro fraco interno?

Isso significa implicitamente que nenhuma chamada de construtor/destruidor será feita e que não haverá manipulação dos contadores de referência do Shared_PTRS.

Foi útil?

Solução

que está ciente dos internos shared_ptr,

Isso deve responder sua pergunta ali. Para estar ciente dos internos, essa coleção quase certamente teria que fazer parte das bibliotecas de ponteiro inteligente da Boost. Infelizmente, não existe tal coisa.

Isso é realmente uma desvantagem para os indicadores inteligentes. Eu recomendaria o uso de estruturas de dados que limitam o número de cópias feitas internamente. As realações do vetor serão dolorosas. Talvez um deque, que tenha uma alocação baseada em pedaços, seria útil. Lembre -se também de que as implementações vetoriais tendem a obter uma nova memória em pedaços exponencialmente crescentes. Então eles não se realocam, digamos, a cada 10 elementos. Em vez disso, você pode começar com 128 elementos; em seguida, o vetor se reserva 256 e depois se move para 512, 1024, etc. Cada vez que dobra o que é necessário.

Além disso, há o PTR_VECTOR da Boost ou pré -alocando suas estruturas de dados com espaço suficiente para impedir a cópia interna.

Outras dicas

Em teoria, após a adoção do C ++ 0x, os contêineres serão modificados para usar a semântica de mover, quando apropriado. Nesse ponto, shared_ptr Também pode ser modificado para ter um construtor de movimentação para minimizar o ajuste desnecessário da contagem de referência.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top