GLib原子和记忆块

时间:2010-03-03 02:44:06

标签: c glib void-pointers dynamic-memory-allocation

以下代码段来自The Official GNOME 2 Developer's Guide

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 *?在运行data[i] = g_mem_chunk_alloc(my_chunk);时是否会发生从gpointer(void *)到gchar *的隐式转换?

  • 如果以上语句为真,则每个gchar *指向42字节的内存。那么如何访问特定原子的所有字节呢? data[7]+41将成为可用的内存位置吗?


  • 当我尝试编译代码时,gcc会产生以下错误消息:

    error: storage size of ‘my_chunk’ isn’t known 怎么了?

1 个答案:

答案 0 :(得分:3)

按您的问题顺序:

  • 每个内存块包含16个原子,但除此之外,是的。
  • 是的,void *可以隐式转换为C中的任何其他指针类型,这通常被认为是好的C风格。他们在这里使用gchar *,因为他们显然希望将每个原子视为42 gchar s的数组。
  • 是的,data[7][41]是第8个原子的最后一个可访问字节。
  • 错误是因为my_chunk的声明错误(GMemChunk是一种不透明的类型,不应在代码中直接实例化)。声明应该是:

    GMemChunk *my_chunk;

根据g_mem_chunk_new()g_mem_chunk_alloc()的签名。

顺便说一句,Glib文档声明不推荐使用Chunk分配器,而应该使用切片分配器。