janeiro 2007


Nesses últimos dias fiquei encucado sobre o que postar aqui no blog, muita coisa rolando mas eu sempre postergando o post, pois bem, hoje decidi que era a hora de arranjar um tempo e escrever algo.

Hoje viajando e lendo umas coisas por ai, acabei me deparando com esse ambiente de programação dinâmico (não, não tem nada a ver com programação dinâmica, que estou guardando um post há tempos…) chamado Processing . Segundo os autores, processing é bem mais que somente mais um ambiente de aprendizado de linguagens de programação, ele se propõe a ser uma IDE para desenvolvimento de obras de arte, sejam elas músicas, pinturas ou animações. Tem um bocado de screenshot lá, algumas com coisas bastante sofisticadas, como a estrela de Kock e uma simulação de fumaça . A linguagem utilizada é java-based e parece ser bem simples de usar. E só pra ir na onda do Paul Graham, copy what you like, amanhã ou depois, vou estar postando um código demonstrando as torres de hanoi em processing, imitando o Amit Singh. A razão de não fazer isso hoje é por conta do Google Code Jam Latin America, cujo Round 1 vai se dar amanhã e eu, felizmente, consegui uma vaga entre os 500, tomara que dê pra chegar entre os 50. Foi legal a participação até agora porque dei uma desenferrujada em assuntos que não via há algum tempo, e principalmente porque vou ver se dá pra participar de alguns campeonatos de algoritmos no topcoder.

that’s all, folks.

Depois de um longo e tenebroso inverno (clichè), estou de volta por conta da sugestão de um cara com quem conviv lá no trabalho por algum tempo e que está indo morar em Fortaleza agora: o maníaco do machado, Emanoel Xavier.

Bem, ontem nas minhas caoticidades (vide “Leituras Caóticas”), estava lendo sobre implementação de Singletons em C++ (e todas as suas dificuldades e gambiarras, mas elocubrações para outro post…) e acabei descobrindo um jeito diferente de dar um new: o placement new.

Segundo a biblioteca padrão de C++, um placement new é somente um overloading de new com passagem de parâmetros adicionais e cuja implementação-padrão não aloca memória. Deixa eu explicar com um exemplo de utilização, depois adentro o mundo das cobras:

Utilização:

class A{
public:
A(){}
~A(){}
...
};
A *p = new A;
...
delete p;
...
p = new (a,b) A; // onde a e b sao objetos ou tipos primitivos quaisquer

Na linha em negrito está o pulo do gato, a sintaxe é diferente do new usual, visto que agora dá pra passar parâmetros.

Bem, eu falei lá em cima que a implementação-padrão não aloca memória, ou seja, em algum dos parâmetros passados no placement new a memória já foi alocada, o que eu quero dizer com isso? A implementação de um placement new parece com algo do tipo:

void *operator new(size_t, void *ondeColocaOObjeto)
{ return ondeColocaOObjeto;}

Vale salientar que o fato de que quando acontece alguma exceção em um construtor o delete correspondente também é chamado, com os mesmos parâmetros e mesma ordem, isto é, quando acontece uma exceção em um placement new com parâmetros a, b e c, o respectivo placement delete com parâmetros a, b e c é chamado.