Pregunta

El siguiente fragmento de código es de Guía El GNOME 2 Oficial del desarrollador :

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);
}
  • ¿Quiere decir esto que cada átomo es de 42 bytes, cada "trozo de memoria" contiene 42 16 átomos, y trozos de memoria 40000/16=2500 serán creados cuando se ejecuta el código de seguridad?

  • ¿Por qué se utilizan gchar * aquí? ¿Tiene una conversión implícita de gpointer (* void) a gchar * tienen lugar cuando se ejecuta data[i] = g_mem_chunk_alloc(my_chunk);?

  • Si la afirmación anterior es cierto, entonces cada gchar * puntos a 42 bytes de memoria. ¿Cómo accedo a todos los bytes de un átomo en particular, entonces? Se data[7]+41 ser una ubicación de memoria utilizable?


  • Cuando intento compilar el código de gcc produce este mensaje de error:

    error: storage size of ‘my_chunk’ isn’t known ¿Qué pasa?

¿Fue útil?

Solución

Con el fin de sus preguntas:

  • Cada bloque de memoria contiene 16 átomos, pero aparte de eso, sí.
  • Si, void * se puede convertir implícitamente a cualquier otro tipo de puntero en C, por lo que normalmente se considera que es un buen estilo C. Están utilizando gchar * aquí, ya que al parecer quieren tratar a cada átomo como una matriz de 42 gchars.
  • Si, data[7][41] es el último byte accesible de la octava átomo.
  • El error se debe a que la declaración de my_chunk está mal (GMemChunk es un tipo opaco que no se deben crear instancias directamente en el código). La declaración debe ser:

    GMemChunk *my_chunk;

según la firma de g_mem_chunk_new() y g_mem_chunk_alloc().

Por cierto, la documentación indica que el asignador Glib Chunk está en desuso, y se debe utilizar el asignador rebanada en su lugar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top