Iniciei meu primeiro projeto em C++ e já aprendi algumas coisas interessantes.
Comecei criando o 'blank canvas' e o principal para o jogo funcionar: o game loop.
Sobre Garbage Collector
Enquanto estava implementando essas funcionalidades, eu percebi que instanciei um objeto do seguinte modo:
Food food = Food();
Olhei pra essa linha, e tive a sensação de faltar algo.
Normalmente em Java, ou até mesmo em TypeScript, quando instanciamos um objeto vem a palavra new
antes dele. E descobri que no C++ também tem esse new
mas por qual motivo ele não foi utilizado?
Bem, quando instanciamos o objeto desse modo, ele é alocado na pilha(stack), ou seja, quando o objeto sai do escopo (por exemplo, ao final da função), ele é "destruído" automaticamente e sua memória é liberada.
Utilizando o new
o objeto é alocado no heap, e por conta disso temos que liberar a memória com a palavra reservada delete
no final do escopo.
Com o Java não há problema alocar objetos no heap (inclusive, esse é o único modo) pois a memória é gerenciada automaticamente pelo Garbage Collector
.
E o que é garbage collector?
Resumindo: É um sistema de gerenciamento automático de memória, ele detecta e libera memória ocupada por objetos e variáveis que não estão mais sendo utilizadas, evitando vazamento de memória(memory leak).
Então, podemos concluir que o C++ não tem garbage collector, pois quando alocamos um objeto no heap, temos que liberar a memória ao final do escopo para não haver memory leak.
Mas, se C++ não tem garbage collector, por qual razão não precisamos preocupar com vazamento de memória quando instanciamos um objeto na stack?
Isso acontece pelo seguinte motivo: Quando um objeto é alocado na stack a memória é automaticamente liberada por conta de um destrutor
e de um gerenciamento feito no tempo de vida dos objetos que ocorre na stack chamado RAII (Resource Acquisition Is Initialization)
.
Tá, mas então o que diferencia o RAII
do Garbage Collector
?
Olha... isso é um buraco de coelho. Irei aceitar por enquanto que o que difere um do outro é a maneira de como os recursos são liberados.
Deixo com vocês as vantagens e desvantagens pontuadas pelo nosso amigo ChatGPT:
Vantagens e Desvantagens
**RAII**:
**Vantagens**:
- Controle preciso e previsível sobre quando os recursos são liberados.
- Não há sobrecarga de tempo de execução para monitorar e coletar objetos.
- Boa para gerenciar diferentes tipos de recursos, não apenas memória.
**Desvantagens**:
- Requer que o programador entenda bem como funcionam os construtores e destrutores.
- Não gerencia a memória no heap automaticamente. Se o programador usar `new`, é necessário usar `delete` manualmente.
**Garbage Collector**:
**Vantagens**:
- Facilita o gerenciamento de memória, pois o programador não precisa se preocupar em liberar memória manualmente.
- Reduz o risco de erros manuais, como vazamentos de memória ou uso de ponteiros para memória já liberada.
**Desvantagens**:
- O garbage collector pode introduzir sobrecargas de desempenho, especialmente em sistemas de tempo real, devido às pausas imprevisíveis.
- A coleta de memória é não determinística, o que significa que a memória pode permanecer alocada por mais tempo do que o necessário, aumentando o consumo de recursos.
Sobre o .h
De forma bem breve, da pra dizer que o .h do C++ funciona de modo parecido com uma interface em Java.
Ambos separam o que o código faz
de como o código faz
.
O .h é uma assinatura de como a classe deve ser, assim como na interface que é utilizada no Java.
Proximos passos
Vou continuar codando esse snake game, e tem me passado na cabeça codar um Sistema Operacional, acho que programar muitos jogos vai ficar massante, então partirei para outros tipos de projetos.
Tchau.