Átomos de libra e pedaços de memória
-
24-09-2019 - |
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
4216 átomos e40000/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 known
O que há de errado?
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 usandogchar *
Aqui porque eles aparentemente querem tratar cada átomo como uma matriz de 42gchar
s. - 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.