C++: operador new de posicionamento
Olá!
O que seria o operador new de posicionamento?
Ta... eu sei que a função dele é alocar memória. xD
Mas qual a utilidade dele? Por que implementar e usar ele ao invés do new comum?
Pelo que eu vi na internet, cria-se uma classe (normalmente chamada Arena) para gerenciar memória juntamente ao operador new sobrecarregado.
Mas não compreendi a essência disso tudo.
Segue o exemplo do livro do Stroustrup modificado:
Código PHP:
struct X {
X(int ii) { i = ii; }
~X() { /* ... */ }
int i;
};
class Arena {
public:
virtual void* alloc(size_t sz) = 0;
virtual void free(void* p) = 0;
// ...
};
void* operator new(size_t sz, Arena* a) {
return a->alloc(sz);
}
extern Arena* Persistent;
extern Arena* Shared;
void g(int i) {
X* p = new(Persistent) X(i);
X* q = new(Shared) X(i);
// ...
}
void destruct(X* p, Arena* a) {
p->~X();
a->free(p);
}
Re: C++: operador new de posicionamento
O motivo mais comum para se (re)implementar o operador new ao invéz de utilizar o padrão, é para criar seu próprio gerenciador de memória. O código de exemplo mostra justamente isto.
O tópico é bastante extenso, e os motivos para se criar um gerenciador de memória variam.
Mas basicamente, você pode controlar a quantidade de alocações, o tamanho das alocações, diminuir a fragmentação de memória, fazer garbage collection (baseado em reference counting), ter melhor controle da memória compartilhada, etc.
Se tiver interesse no assunto, recomendo a leitura destes artigos:
1. Building your own memory manager for C/C++ projects
2. Inside memory management
Re: C++: operador new de posicionamento
Interessante o primeiro artigo.
Me deu várias ideias.
Ele pode ser abaixado em pdf aqui: https://www6.software.ibm.com/develo...anager-pdf.pdf .
Não consegui ler o segundo ainda, mas pelo que vi ele é mais voltado para C.
Obrigado.