1

以下代码片段来自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* ?运行时是否会发生从 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 怎么了?

4

1 回答 1

3

按照您的问题顺序:

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

    GMemChunk *my_chunk;

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

顺便说一句,Glib 文档声明不推荐使用 Chunk 分配器,您应该改用 slice 分配器。

于 2010-03-03T04:24:20.333 回答