Enviado em 21/05/2013 - 23:43h
As funções malloc, realloc, calloc e free permitem fazer alocação dinâmica. No entanto, gostaria de obter um controle maior sobre a alocação no meu programa e preciso saber o total da memória disponível de forma que eu consiga manter a portabilidade entre sistemas. Existe uma função padronizada? Como posso fazer isso em C?Enviado em 22/05/2013 - 06:17h
Tanto o padrão da linguagem C (e também o de C++) quanto a biblioteca padrão fazem muito poucas exigências e assunções sobre características da máquina ou do SO em que os programas escritos em C podem executar. De seu ponto de vista, um programa conforme deve executar de modo absolutamente idêntico num super mainframe, num PC parrudão, numa máquina teórica com memória infinita, num micrinho de 8 bits antigo ou por um aluno aplicando o "método do chinês" com a ajuda do seu caderno. Supõe-se pouco além de uma entidade capaz de executar as instruções e alguma forma de memória que possa sofre acessos de leitura e gravação e que permita operações indiretas por meio de ponteiros. Quando se fala em limites (e mais nos requisitos da biblioteca padrão do que características da linguagem em si), geralmente são limites mínimos para que as algumas funções possam executar com conforto./* Programa de teste de alocacao maxima de memória usando apenas C padrão (conforme ISO C99). */ #include <limits.h> #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> size_t alloc_max(size_t chunk_size){ void *old_p, *new_p; size_t total; if(chunk_size<sizeof(size_t)){ fprintf(stderr, "O tamanho minimo do bloco deve ser de %zu bytes.\n", sizeof(size_t)); return 0; } total=0; old_p=NULL; while((new_p=malloc(chunk_size))!=NULL){ total+=chunk_size; /* XXX: Preenche memória alocada (para forçar seu uso efetivo em sistema com lazy allocation. Por isso, aliás, a restrição de tamanho mínimo, imposta acima. */ memset(new_p, rand(), chunk_size); /* Guarda o endereço do bloco anterior no começo do novo bloco, para poder desalocar depois. */ *(size_t **)new_p=old_p; old_p=new_p; } for(new_p=old_p; new_p!=NULL; new_p=old_p){ old_p=*(void **)new_p; free(new_p); } return total; } int main(void){ size_t chunk, max; for(chunk=4096; chunk<SIZE_MAX/32+1; chunk*=16){ max=alloc_max(chunk); printf("Total de %zu bytes (%zu blocos de %zu bytes).\n", max, max/chunk, chunk); } return 0; }
Enviado em 22/05/2013 - 00:22h
Vai depender muito do SO, no caso do Linux, o jeito mais fácil seria assim:Enviado em 22/05/2013 - 00:41h
Obrigado pela resposta, no entanto eu preciso de um método comum entre todos os sistemas. Conheço os dois métodos no Linux. Estou evitando colocar no código aquelas definições do tipo: #ifdef WIN32 ou sei lá oque... faça isso, senão faz aquilo. Quero um sistema abrangente.Enviado em 22/05/2013 - 05:57h
E para windows:Enviado em 22/05/2013 - 12:02h
Obrigado Paulo e GoKernel. Estava evitando escrever algo como postado acima. Pensei exatamente em testar a quantidade de memória total usando esse tipo de alocação, no entanto se eu tivesse pensado mais um pouco, ia determinar que a memória é administrada pelo Sistema Operacional, de forma que não há como padronizar a obtenção desses dados em código sem superficialidade. Cheguei naquele momento em que meu projeto precisa escolher um sistema e vou de Linux mesmo. Obrigado a todos.Criar entrada (menuentry) ISO no Grub
Como gerar qualquer emoji ou símbolo unicode a partir do seu teclado
Instalando o Pi-Hole versão v5.18.4 depois do lançamento da versão v6.0
Instalar o VIM 9.1 no Debian 12
Como saber o range de um IP público?
Muitas dificuldades ao instalar distro Linux em Notebook Sony Vaio PCG-6131L (VPCEA24FM)
Linux Mint (21.2) não reconhece teclado mecanico RASEC da PCYES (2)