Oi, queria saber se tem algo de errado em fazer isso:
int *p;
do {
p = (int*) malloc( <valor>*sizeof(int) );
} while(p == NULL);
Isso é, tem algo de errado em ficar tentando alocar memória até conseguir? Ou isso é arriscado? Porque se for, então o melhor é retornar assim que o programa perceber que não conseguiu memória? Isso pode fazer meu EP falhar dependendo do quanto de memória disponível tem o computador que o executa, o que não seria legal ^^".
Eu tava pensando em usar isso tb, só que durante uma iteração i, com o <valor>[i+1] < <valor>[i].
Aí meio que desisti, porque não sabia como medir qual era o tamanho na RAM consumida por isso, que podia ainda ser grande e não-viável.
Talvez no mesmo contexto disso, fui fuçar no comando 'time' do Linux e vi que ele pode retornar outras informações, tipo o espaço consumido em memória, mas não consegui fazer ele funcionar. Sei que seria bem útil... =/
Por fim, tem alguma forma conhecida de ser medir o espaço consumido em memória?
Aí meio que desisti, porque não sabia como medir qual era o tamanho na RAM consumida por isso, que podia ainda ser grande e não-viável.
Talvez no mesmo contexto disso, fui fuçar no comando 'time' do Linux e vi que ele pode retornar outras informações, tipo o espaço consumido em memória, mas não consegui fazer ele funcionar. Sei que seria bem útil... =/
Por fim, tem alguma forma conhecida de ser medir o espaço consumido em memória?
"Por fim, tem alguma forma conhecida de ser medir o espaço consumido em memória?"
Pelo menos no Windows, um jeito facil de fazer isso fora do seu programa (nao no codigo) eh abrindo o gerenciador de tarefas, e vendo o "uso de memoria" do processo do seu programa (<nome do programa>.exe) :P
Esqueci de especificar...
É no Linux. =)
É no Linux. =)
top no Unix é algo como um "gerenciador de tarefas" do Windows, mas melhorado 
No entanto, pra medir uso de memória sugiro o Valgrind: http://valgrind.org/
No entanto, pra medir uso de memória sugiro o Valgrind: http://valgrind.org/
No caso, eu até tenho noção de quanta memoria to usando. Meu problema é saber se quem corrigir o EP vai ter essa memoria.
O Alexandre (monitor) disse que até uns 200mb é o ideal. Mas e se nem isso houver? Ou mesmo que haja, mas demore para estar disponivel? O tempo de execução do meu EP fica comprometido, porque estarei tentando pegar essa memoria até que consiga. E caso deva simplesmente desistir se não peguei a memória, então nem resultado o EP tem naquela execução...
O Alexandre (monitor) disse que até uns 200mb é o ideal. Mas e se nem isso houver? Ou mesmo que haja, mas demore para estar disponivel? O tempo de execução do meu EP fica comprometido, porque estarei tentando pegar essa memoria até que consiga. E caso deva simplesmente desistir se não peguei a memória, então nem resultado o EP tem naquela execução...
Você tem noção exata de quanto você usa? Se for 250mb não acho que tenha problemas; se for mais de 500mb acho que é um exagero. Calcule a memória no pior caso.
De qualquer forma, 200mb de memória é mais do que meu sistema operacional inteiro usa, com Firefox aberto. E são mais de 50 milhões de inteiros. Eu acho que se seu programa usa mais que isso você deveria pensar em fazer de outra maneira. É realmente necessário tudo isso? Será que não há uma estrutura de dados mais apropriada?
Não creio que você esteja fazendo isso, mas acho bom comentar: Se você tentar alocar algum dos valores da entrada (que pode chegar a 2^64-1), o uso de memória passa de 60 milhões de terabytes
De qualquer forma, 200mb de memória é mais do que meu sistema operacional inteiro usa, com Firefox aberto. E são mais de 50 milhões de inteiros. Eu acho que se seu programa usa mais que isso você deveria pensar em fazer de outra maneira. É realmente necessário tudo isso? Será que não há uma estrutura de dados mais apropriada?
Não creio que você esteja fazendo isso, mas acho bom comentar: Se você tentar alocar algum dos valores da entrada (que pode chegar a 2^64-1), o uso de memória passa de 60 milhões de terabytes
Pô, ainda bem que vc já avisou disso, aheuauhe!
Então, ainda no contexto do malloc:
tenho uma struct, aí dou (em linguagem meio porca, só pra entender)
var = malloc(1, sizeof(struct))
No final eu devo dar free(var)?
Se sim, eu tava dando, mas ele tava dando um erro bem grandinho... XD
Então, ainda no contexto do malloc:
tenho uma struct, aí dou (em linguagem meio porca, só pra entender)
var = malloc(1, sizeof(struct))
No final eu devo dar free(var)?
Se sim, eu tava dando, mas ele tava dando um erro bem grandinho... XD
Se você está fazendo:
struct x *var;
var = malloc(sizeof(struct x));
free(var);
... deveria funcionar.
struct x *var;
var = malloc(sizeof(struct x));
free(var);
... deveria funcionar.
XD
Putz, sei lá então...
Acho melhor deixar lá no EP comentado que dá esse problema então.
Putz, sei lá então...
Acho melhor deixar lá no EP comentado que dá esse problema então.
Para medir memória e encontrar licks o valgrind que o Tiago falou é muito bom! http://valgrind.org/. Vale muito a pena aprender a usar minimamente (pelo menos para 122 e Estrutura de Dados (ED))
Quanto ao malloc, o mais comum é tentar alocar a memória e, caso não der certo (p == NULL), aborta o programa e retorna -1 (indicando falha). Fazer um loop para tentar alocar pode ser um problema, pois se houve alguma falha na alocação, é provável que ela vá continuar e seu programa pode entrar em loop.
Quanto ao malloc, o mais comum é tentar alocar a memória e, caso não der certo (p == NULL), aborta o programa e retorna -1 (indicando falha). Fazer um loop para tentar alocar pode ser um problema, pois se houve alguma falha na alocação, é provável que ela vá continuar e seu programa pode entrar em loop.
Se o malloc devolveu NULL eh porque nao tem memoria disponivel, entao nao adianta tentar varias vezes. Meu conselho de monitor e de amigo: nao complique as coisas; ao contrario, tente sempre escolher a solucao mais simples. Neste EP nao ha necessidade de usar malloc. Se voce quer usar um vetor de memoizacao, aloque-o estaticamente ("int v[MAX];", para algum valor MAX que seja razoavel), e use este mesmo vetor ao longo de toda a execucao. Alguns podem pensar: mas se o MAX for grande e a entrada for pequena o meu programa vai ficar lento para esta entrada. Resposta: se preocupe 99,99999...% com as entradas grandes e 0,0000...1% com as entradas pequenas. Por pior que seja o programa ele eh satisfatorio para entradas pequenas.
Obs.: Desculpem a falta de acentos.
Obs.: Desculpem a falta de acentos.