Copiar alocador stateful: semântica do alocador de biblioteca padrão e memória interna
Estou escrevendo uma coleção de alocadores, com a intenção de que eles sejam usados em ambientes de alto desempenho. Portanto, é recomendável um pouco de uso restrito (mediado pelo compilador, não por erros de tempo de execução). Estive lendo a semântica do C ++ 11 dos alocadores com estado e como eles devem ser usados pelos contêineres em conformidade.
Colei um alocador simples abaixo do qual apenas contém um bloco de memória no objeto alocador. No C ++ 03, isso era ilegal.
template <typename T, unsigned N>
class internal_allocator {
private:
unsigned char storage[N];
std::size_t cursor;
public:
typedef T value_type;
internal_allocator() : cursor(0) {}
~internal_allocator() { }
template <typename U>
internal_allocator(const internal_allocator<U>& other) {
// FIXME: What are the semantics here?
}
T* allocate(std::size_t n) {
T* ret = static_cast<T*>(&storage[cursor]);
cursor += n * sizeof(T);
if (cursor > N)
throw std::bad_alloc("Out of objects");
return ret;
}
void deallocate(T*, std::size_t) {
// Noop!
}
};
No C ++ 11, isso é possível?O que significa copiar um alocador com estado? Como o contêiner de destino chama o construtor de cópia para todos os elementos no contêiner de origem, a memória dentro do alocador deve ser explicitamente copiada ou a construção padrão é suficiente?
Isso leva à questão, dado o desempenho como objetivo final, quais são os valores sãos parapropagate_on_container_
{copy
,swap
,move
}? O queselect_on_container_copy_construction
Retorna?
É um prazer fornecer mais detalhes mediante solicitação, pois esse parece um problema bastante nebuloso - pelo menos para mim =)
Esta afirmação decorre da definição de que quandoa == b
retornatrue
por duas instâncias do mesmoAllocator
tipo, é garantido que a memória alocada coma
pode ser desalocado comb
. Isso parece nunca ser verdade para esse alocador. A norma também afirma que, quando um alocador é construído de cópia, como emA a(b)
, a == b
é garantido para retornar true.