内存储片

内存储片

用 GSlice 来分配大小相等的内存空间是一种节省空间且具有多处理可伸缩性。自 GLib 2.76 起,已移除其实现,它会调用 g_malloc()g_free(),因为自编写 GSlice 以来,系统默认分配器在所有平台上的性能都有所提升。

尚未弃用 GSlice API,因为它们被广泛使用,而对其进行弃用会产生严重的影响,几乎没有好处可言。

应该使用 g_new()/g_malloc()g_free() 编写新代码。除非正在重写,否则将现有代码从 g_slice_new()/g_slice_free() 移植出来没有任何特别的好处。

以下是使用切片分配器的一个示例

gchar *mem[10000];
gint i;

// Allocate 10000 blocks.
for (i = 0; i < 10000; i++)
  {
    mem[i] = g_slice_alloc (50);

    // Fill in the memory with some junk.
    for (j = 0; j < 50; j++)
      mem[i][j] = i * j;
  }

// Now free all of the blocks.
for (i = 0; i < 10000; i++)
  g_slice_free1 (50, mem[i]);

以下是使用切片分配器进行数据结构的示例

GRealArray *array;

// Allocate one block, using the g_slice_new() macro.
array = g_slice_new (GRealArray);

// We can now use array just like a normal pointer to a structure.
array->data            = NULL;
array->len             = 0;
array->alloc           = 0;
array->zero_terminated = (zero_terminated ? 1 : 0);
array->clear           = (clear ? 1 : 0);
array->elt_size        = elt_size;

// We can free the block, so it can be reused.
g_slice_free (GRealArray, array);