【问题标题】:Cross-platform memory allocator sbrk/virtualalloc跨平台内存分配器 sbrk/virtualalloc
【发布时间】:2009-04-23 03:04:52
【问题描述】:

我想知道是否有比 malloc/free 低一级的跨平台分配器。

例如,我想要在 Linux 中简单地调用 sbrk 和在 Windows 中调用 VirtualAlloc 的东西(可能还有两个类似的系统调用,但这只是一个示例)。

【问题讨论】:

  • 我想知道如果存在这样的分配器会有什么好处?
  • 您可以实现自己的 malloc/free,而无需担心底层操作系统。
  • 听起来完全相反。 malloc/free 是跨操作系统的标准接口(通过 C 库),您的每个操作系统都需要不同的操作系统调用。

标签: c++ c memory cross-platform


【解决方案1】:

我不熟悉有问题的功能,但是:

#if defined (__WIN32__)
  #define F(X) VirtualAlloc(X)
#elif defined (__LINUX__) /* or whatever linux's define is */
  #define F(X) sbrk(X)
#endif

不确定语法是否 100%(我是宏和 c 的新手),但总体思路应该可行。

【讨论】:

  • 好吧,我知道如何定义,但 virtualalloc 和 sbrk 不是 100% 等效的函数。
  • mmap() 用于匿名内存可能更像 VirtualAlloc
【解决方案2】:

C 为您提供mallocfree,C++ 增加了newnew[]deletedelete[] 以及除了C 提供的布局形式。

再多的话,你就超出了语言本身的范围。您要么在 OS 领域工作,要么在汇编程序中埋头苦干。毫无疑问,这些东西是跨平台的。

我想知道如果存在这样的分配器会有什么好处?

您可以实现自己的 malloc/free,而无需担心底层操作系统

并且您会想要另一个跨平台解决方案来实现这个和另一个......您明白了。这不是一个可行的方案。

【讨论】:

  • 其实 malloc 和 sbrk/virtualalloc 在概念上是不同的。 Malloc 通常带有诸如大小标头之类的开销。我认为没有理由不能制作一个分配单个可调整大小的全局内存板的版本
【解决方案3】:

我最近发现了这篇文章:

http://www.genesys-e.org/jwalter//mix4win.htm

它基本上是在Windows下使用VirtualAlloc实现sbrk()。

【讨论】:

    猜你喜欢
    • 2014-05-22
    • 1970-01-01
    • 2014-04-30
    • 2014-12-29
    • 1970-01-01
    • 2011-07-23
    • 2011-08-30
    • 2020-01-25
    • 2011-08-25
    相关资源
    最近更新 更多