O que fazer na versão específica classe de posicionamento novo?

votos
1

versão específica de classe de posicionamento novo pode ser fornecido, mesmo que você não pode substituir o global. Que cenários existem onde uma classe deve fornecer seu próprio posicionamento novo operador?

Mesmo se minha classe não implementar posicionamento novo as seguintes obras de código (assumindo para abc nenhum operador novo está sobrecarregado).

char arr[100];

abc *pt = new(&arr)abc; 

Então eu interpretar, há algum posicionamento padrão novo, mas para a classe, podemos fornecer nossa própria versão do novo operador, a minha pergunta é o que é o caso de uso para isso? O que se deve fazer outro em seguida, retornar o mesmo ponteiro que é passado? Existe algum exemplo / cenário útil que você encontrou?

Publicado 27/08/2009 em 06:49
fonte usuário
Em outras línguas...                            


4 respostas

votos
1

Infelizmente, AFAIK, você não pode fazer uma sobrecarga específica de classe do novo operador colocação padrão, apenas o posicionamento personalizado novos operadores. Assim, um caso de uso para ele é um pouco acadêmico, mas eu queria usá-lo para proibir a colocação nova na classe usando = deletede C ++ 11. Isso funciona muito bem com a norma operator new, mas não para a colocação de novo.

Respondeu 19/09/2015 em 11:37
fonte usuário

votos
1

Soa como uma pergunta quiz ...

Mais rápido e mais magro Allocation
A razão mais comum é um monte de pequenos objetos que precisam ser alocada dinamicamente. Um alocador personalizado para objetos de tamanho fixo tem muito menos sobrecarga de alocação de um alocador genérica, não sofre de fragmentação, e é tipicamente mais rápido. (Além disso, quando estas atribuições são removidos da pilha principal, eles não contribuem para a fragmentação da heap principal anymore).

De forma similar, um alocador de não-liberação (onde você pode alocar vários objetos, mas não pode libertá-los juntos, apenas em conjunto) é o esquema de alocação mais rápido possível, e não tem qualquer sobrecarga (exceto alinhamento em alguns casos raros). Faz sentido se você está construindo uma estrutura de dados que você nunca modificar, excluir apenas como um todo.

Outra base alocador
Outra aplicação é a atribuição de uma pilha diferente do que a pilha de C ++. Talvez os dados nos objetos precisa ser alocado na memória compartilhada para a troca com outros processos, ou ele precisa ser passado para uma função sistema que toma posse e requries o uso de um determinado alocador. (Note que este necessita para implementar o mesmo mecanismo para todos os sub-objetos, também, não há nenhuma maneira genérica para conseguir isso).

De forma similar (onde eu usá-lo) é quando você criar um código na mosca. Hoje em dia, você precisa dizer ao sistema operacional que os dados nesta página memória tem permissão para executar, mas você começa esta memória em vez pedaços grandes (por exemplo, 4K). Então, novamente, solicitar uma página (4K) do OS com direitos de execução, em seguida, alocar muitos pequenos objetos em cima dele - usando posicionamento novo.

Respondeu 27/08/2009 em 07:38
fonte usuário

votos
0

eu não tenho certeza que é possível sobrecarregar a colocação de novo, apenas o novo regular. Eu não consigo pensar em até mesmo um único uso para isso, já que a única aplicação possível é apenas criar um objeto temporário e memcp'ing-lo para o endereço de memória - desde que você não é suposto para alocar qualquer outra memória lá, mas usar o dado.

Respondeu 09/09/2009 em 21:32
fonte usuário

votos
0

Diretamente da boca do cavalo wiki . A seção intitulada 'Use' destaca a necessidade de colocação de novo. Este SO enfiar aqui pode também ajudar

UPDATE: Para responder especificamente você pergunta; Você pode usar o posicionamento novo padrão fornecido pelo cabeçalho <new>se você tiver um pool de memória que pretende utilizar para a construção de alguns objetos de uma classe, mas não quer sobrecarregar o operador novo para toda a classe. Neste último caso, todos os objectos de classe são colocados de acordo com a colocação sobrecarregado novo tal como definido na classe

Respondeu 27/08/2009 em 06:59
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more