GLib атомы и блоки памяти - PullRequest
1 голос
/ 03 марта 2010

Следующий фрагмент кода взят из Официальное руководство разработчика по 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);
}
  • Означает ли это, что каждый атом имеет 42 байта, каждый «блок памяти» содержит 42 16 атомов, и 40000/16=2500 фрагменты памяти будут созданы при запуске кода выше? *

  • Почему они используют gchar * здесь? Происходит ли неявное приведение из gpointer (void *) к gchar * при запуске data[i] = g_mem_chunk_alloc(my_chunk);?

  • Если приведенное выше утверждение верно, то каждый gchar * указывает на 42 байта памяти. Как мне получить доступ ко всем байтам определенного атома? data[7]+41 будет использоваться в памяти?


  • Когда я пытаюсь скомпилировать код, gcc выдает следующее сообщение об ошибке:

    error: storage size of ‘my_chunk’ isn’t known Что не так?

1 Ответ

3 голосов
/ 03 марта 2010

В порядке ваших вопросов:

  • Каждый блок памяти содержит 16 атомов, но кроме этого, да.
  • Да, void * может быть неявно преобразовано в любой другой тип указателя в C, и это обычно считается хорошим стилем C. Они используют gchar * здесь, потому что они, очевидно, хотят рассматривать каждый атом как массив из 42 gchar с.
  • Да, data[7][41] - последний доступный байт 8-го атома.
  • Ошибка в том, что объявление my_chunk является неправильным (GMemChunk является непрозрачным типом, который не должен непосредственно создаваться в вашем коде). Декларация должна быть:

    GMemChunk *my_chunk;

согласно подписи g_mem_chunk_new() и g_mem_chunk_alloc().

Кстати, документация Glib гласит, что распределитель чанков устарел, и вместо него следует использовать распределитель слайсов.

...