Pergunta

O snippet de código a seguir é de O Guia Oficial do Desenvolvedor do Gnome 2:

GMemChunk my_chunk;
my_chunk = g_mem_chunk_new("My Chunk",
                           42,
                           42*16,
                           G_ALLOC_AND_FREE);
gchar *data[50000];
gint i;

/* allocate 40,000 atoms */
for(i = 0; i < 40000; i++)
{
   data[i] = g_mem_chunk_alloc(my_chunk);
}
  • Isso significa que todo átomo é de 42 bytes, cada "pedaço de memória" contém 42 16 átomos e 40000/16=2500 Os pedaços de memória serão criados quando o código acima for executado?

  • Por que eles estão usando GCHAR* aqui? Um elenco implícito de GPointer (void*) para Gchar* ocorre quando data[i] = g_mem_chunk_alloc(my_chunk); é executado?

  • Se a instrução acima for verdadeira, cada GChar* apontará para 42 bytes de memória. Como faço para acessar todos os bytes de um átomo específico, então? Vai data[7]+41 ser um local de memória utilizável?


  • Quando tento compilar o código GCC produz esta mensagem de erro:

    error: storage size of ‘my_chunk’ isn’t knownO que há de errado?

Foi útil?

Solução

Em ordem de suas perguntas:

  • Cada bloco de memória contém 16 átomos, mas fora isso, sim.
  • Sim, void * pode ser implicitamente convertido em qualquer outro tipo de ponteiro em C, e isso é normalmente considerado um bom estilo C. Eles estão usando gchar * Aqui porque eles aparentemente querem tratar cada átomo como uma matriz de 42 gchars.
  • Sim, data[7][41] é o último byte acessível do 8º átomo.
  • O erro é porque a declaração de my_chunk está errado (GMemChunk é um tipo opaco que não deve ser instanciado diretamente no seu código). A declaração deve ser:

    GMemChunk *my_chunk;

Conforme a assinatura de g_mem_chunk_new() e g_mem_chunk_alloc().

A propósito, a documentação do Glib afirma que o alocador de pedaços está preterido e você deve usar o alocador de fatia.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top