átomos de GLib y trozos de memoria
-
24-09-2019 - |
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
4216 átomos, y trozos de memoria40000/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?
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 utilizandogchar *
aquí, ya que al parecer quieren tratar a cada átomo como una matriz de 42gchar
s. - 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.