我倾向于使用 std *alloc/free 函数在我的 C 程序中分配/释放动态内存。我想知道是否有充分的理由使用GLIB 内存分配函数而不是 std 函数。
如果社区能指出这些解决方案中的任何一个是赢家/输家的情况,我将不胜感激。我也对使用其中一种时可能遇到的性能问题感兴趣。
谢谢 !
编辑到状态平台
这些程序通常在所有类型的 Linux/Unix 发行版上运行,通常是使用 gcc 4.2 编译的 64 位拱门。
我倾向于使用 std *alloc/free 函数在我的 C 程序中分配/释放动态内存。我想知道是否有充分的理由使用GLIB 内存分配函数而不是 std 函数。
如果社区能指出这些解决方案中的任何一个是赢家/输家的情况,我将不胜感激。我也对使用其中一种时可能遇到的性能问题感兴趣。
谢谢 !
编辑到状态平台
这些程序通常在所有类型的 Linux/Unix 发行版上运行,通常是使用 gcc 4.2 编译的 64 位拱门。
在我看来,GLib 函数和标准库函数之间最有价值的区别在于,如果分配失败,GLib 函数会中止程序。不再检查返回值malloc()
是否为NULL
! 除此之外,分配策略没有区别-内部g_malloc()
调用malloc()
,尽管正如此处的其他答案之一所述,可以更改它。
另一个区别是 GLib 函数允许您使用g_mem_profile()
.
GLib 也有一个切片分配器,如果您分配许多大小相等的内存块,它会更有效。这不使用系统malloc()
,free()
但同样,可以出于调试目的对其进行更改。
如果你出于某种原因想自己控制底层分配策略,可以使用g_mem_set_vtable()来使用自己的函数,而不是 malloc() / free()。
malloc/free 也可以通过魔术链接选项实现这一点,但 GLIB 为此公开了一个明确的 API,以及使用mem-profiler-table添加您自己的分配和免费日志记录的可能性。
取决于底层架构。在 SCO Unix fe 下,malloc 遵循“最佳匹配”策略,即内存优化但速度分隔。
因此,如果您的程序依赖于不同系统/平台上的特殊假设,那么控制 malloc 策略总是好的。