2010-03-03 11 views
1

Le fragment de code suivant est de The Official GNOME 2 Developer's Guide:atomes GLib et des morceaux de mémoire

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); 
} 
  • Cela signifie-t chaque atome est de 42 octets, chaque "bloc de mémoire" contient 16 atomes de carbone, et 40000/16=2500 blocs de mémoire seront créés lorsque le code ci-dessus est exécuté? Pourquoi utilisent-ils gchar * ici? Est-ce qu'une distribution implicite de gpointer (void *) en gchar * a lieu lorsque data[i] = g_mem_chunk_alloc(my_chunk); est exécuté?

  • Si l'instruction ci-dessus est vraie, chaque gchar * pointe sur 42 octets de mémoire. Comment puis-je accéder à tous les octets d'un atome particulier, alors? Est-ce que data[7]+41 sera un emplacement de mémoire utilisable?


  • Lorsque je tente de compiler le code gcc produit ce message d'erreur:

    error: storage size of ‘my_chunk’ isn’t known Qu'est-ce qui ne va pas?

+0

Merci caf. --Variance – Variance

Répondre

3

Pour vos questions:

  • Chaque bloc de mémoire contient 16 atomes, mais à part ça, oui.
  • Oui, void * peut être implicitement converti en tout autre type de pointeur dans C, ce qui est généralement considéré comme un bon style C. Ils utilisent gchar * ici parce qu'ils veulent apparemment traiter chaque atome comme un tableau de 42 gchar s. Oui, data[7][41] est le dernier octet accessible du 8ème atome.
  • L'erreur est que la déclaration de my_chunk est erronée (GMemChunk est un type opaque qui ne doit pas être directement instancié dans votre code). La déclaration doit être:

    GMemChunk *my_chunk;

selon la signature de g_mem_chunk_new() et g_mem_chunk_alloc(). Par ailleurs, la documentation Glib indique que l'allocateur de bloc est obsolète et que vous devez utiliser l'allocateur de segment à la place.