【问题标题】:GLib atoms and memory chunksGLib 原子和内存块
【发布时间】:2010-03-03 02:44:05
【问题描述】:

以下代码sn-p来自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 怎么了?

【问题讨论】:

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


    【解决方案1】:

    按照您的问题顺序:

    • 每个内存块包含 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 分配器。

    【讨论】:

      猜你喜欢
      • 2011-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-24
      相关资源
      最近更新 更多