Sobre a recursão...

Sobre a recursão...

por Ricardo Mikio Morita -
Número de respostas: 3

Professor, quanto ao uso de memoria da funcao recursiva juntaPixels, quanto de memoria ela ocupa, tanto uma chamada quanto a arvore toda?

Eu estava pensando e cheguei em numeros absurdos! Depois que a funcao juntaPixels acaba, o tamanho da lista encadeada deve ser mais razoavel, mas se chamassemos um juntaPixels que devesse fzer recursivo do (0,0) ate o (480,640), iria dar quantos bytes?? Eu cheguei em gigabytes mas devo ter feito as contas erradas...

Por curiosidade, quanto de espaco um CelPixel ocupa? Seria soh o tamanho das 2 variaveis int + o ponteiro de struct (2 para 32 bits, 4 para 64 bits?), totalizando 18/20 bytes? Por acaso o C arredonda memoria alocada para multiplos de 4/8 como Java?

Por fim, devemos nos focar nos casos tipicos de imagems? O meu da problema quando as linhas sao "vazadas". Devo me preparar para esses tipos de caso tambem (devem haver outros bizarros que dao problema tb....)? 

Em resposta à Ricardo Mikio Morita

Re: Sobre a recursão...

por Claynon Souza -

Usando a juntaPixel numa imagem 480x640 cheguei em poucos MB.

Veja se não fiz nada de errado:

Numa região "perdemos" duas colunas e duas linhas que são de borda então numa região 480x640 na verdade apenas 478x638 estarão ligados, resultando em 304.964 pixels (dá pra confirmar esse número com a função segmentaRegiões). A função sizeof retorna o tamanho em bytes de um tipo de dados. sizeof(CelPixel) = 12. Como pela implementação da nossa lista temos uma célula apontando para outra sem gastar mais memória podemos concluir que gastamos 304964pixels * 12B/pixel = 3659568 B = 3574kB = 3,5MB

Em resposta à Claynon Souza

Re: Sobre a recursão...

por Ricardo Mikio Morita -

Oi Claynon! Obrigado pela rapidez em responder

Eu deveria ter testado antes de fazer mas eu nao estou com programa na mao pra testar, so peguei uma calculadora e fiquei pensando.  Ainda errei, em vez de dividir por 1024 duas vezes, eu dividi uma vez soh e fiquei assustado haha. Por acaso ele arredonda alguma coisa (struct, funcoes, programas) para algum numero divisivel por 4/8 como Java?

Ultima enchecao de saco, a alocacao dessa memoria e toda na RAM? Ele usa memoria virtual? Pq a velocidade de processamento muda bastante dependendo do caso, nao?

 

edit: Estava confundindo tamanho de variavel int com double, retirei do post essa parte

Em resposta à Ricardo Mikio Morita

Re: Sobre a recursão...

por Claynon Souza -

Não sei como se o C faz esses arredondamentos. E ai professores e monitores?

Quanto a memória eu acho (mas não tenho certeza) que quem lida com isso é o SO, quando o programa pede memória mais memória que ele tem ele começa a dar memória virtual. Não cheguei a reparar diferença de velocidade, mas nem prestei muita atenção nisso.