Snmalloc

内存分配器
授权协议 MIT
开发语言 C/C++
所属分类 应用工具、 操作系统工具
软件类型 开源软件
地区 不详
投 递 者 颛孙轩昂
操作系统 跨平台
开源组织 微软
适用人群 未知
 软件概览

snmalloc 是一个研究性质的内存分配器。 其主要设计特点是:

  • 由分配它的同一线程释放的内存不需要任何同步操作。
  • 在最初分配它的不同线程中释放内存,不占用任何锁,而是使用新颖的消息传递方案将内存返回到原始分配器,在那里它被回收。
  • 分配器使用大范围的页面来减少所需的元数据量。

在 Windows 中构建

依赖于 Visual Studio 2017.

mkdir build
cd build
cmake -G "Visual Studio 15 2017 Win64" ..
cmake --build . --config Debug
cmake --build . --config Release
cmake --build . --config RelWithDebInfo

如果是在 IDE 中操作的话,你可以忽视最后三步。Visual Studio 构建使用一个独立的目录来为每个构建配置保存二进制文件。

此外你可以参考下一部分内容来使用 Visual Studio 编译器和 Ninja 构建。

在 Mac OS X 、Linux 和 FreeBSD 中构建

Snmalloc 依赖很少,包括 CMake, Ninja, Clang 6.0 以及一个 C++17 标准库。当前不推荐使用 GCC 编译,因为 GCC  在 COMDAT 中缺少对指定变量 selectany 属性的支持。但是可以在 GCC-7 中构建,但需要预先设置一些全局变量

构建调试配置:

mkdir build
cd build
cmake -G Ninja .. -DCMAKE_BUILD_TYPE=Debug
ninja

构建发行配置:

mkdir build
cd build
cmake -G Ninja .. -DCMAKE_BUILD_TYPE=Release
ninja

开启优化器,但包含调试配置:

mkdir build
cd build
cmake -G Ninja .. -DCMAKE_BUILD_TYPE=RelWithDebInfo
ninja

在 ELF 平台上,上述构建将生成一个二进制文件 libsnmallocshim.so 。这个文件可以使用 LD_PRELOAD来用该分配器替代系统分配器,如下:

LD_PRELOAD=/usr/local/lib/libsnmallocshim.so ninja

CMake Feature Flags

These can be added to your cmake command line.

-DUSE_SNMALLOC_STATS=ON // Track allocation stats
-DUSE_MEASURE=ON // Measure performance with histograms

The project can be included in other CMake projects as a header only library:

set(SNMALLOC_ONLY_HEADER_LIBRARY ON)
add_subdirectory([...]/snmalloc EXCLUDE_FROM_ALL)

This has a single build target snmalloc_lib, which includes the necessary compiler and linker flags, to use snmalloc as a header-only library.

 相关资料
  • 问题内容: 这是一篇受此评论启发的帖子,内容涉及如何在CPython中为对象分配内存。最初,这是在创建列表并将其添加到for循环中_以_ 实现列表理解的上下文中。 所以这是我的问题: CPython中有多少个不同的分配器? 每个功能是什么? 什么时候被正式称为?(根据此评论中的内容,列表理解可能不会导致调用, python在启动时会为其分配多少内存? 是否有规则来控制哪些数据结构在此存储器上首先获

  • 我有一个一直在思考的问题。以这个特殊的类为例 假设我有一个B类,它拥有一个使用listOne读取详细信息的方法。要查看数组列表,我需要首先获取列表的大小,以便我的代码知道数组列表何时结束。有两种方法可以做到这一点,一种是 或者我也可以用 在内存和效率方面,哪种方法更好?此外,假设我正在递归地读取一个非常大的数组。为了简单起见,让我们假设递归读取此数组将导致堆栈溢出异常。在这种情况下,第一个方法在理

  • 我开发了kervel驱动程序,并与dell进行了通信。尝试做一个快照功能和行走功能 我的结构是 在我的快照函数中,我这样做。 在walk函数中,我执行以下操作 当我在我的驱动程序条目中(当驱动程序加载时)使用这个函数时,所有的工作都很好。但当我从dll中调用它时,只有2秒钟的时间“Word Fine”,然后我就会出现蓝屏。 当我尝试从SM_MSI结构中删除Name变量时,所有工作都很完美。!!所以

  • 我正在尝试使用我的GPU而不是CPU来训练一个自定义的对象检测模型。我遵循了以下教程中给出的所有说明:https://tensorflow-object-detection-api-tutorial.readthedocs.io/ 我已经测试了我的软件,一切都已安装并正常工作。 目前正在使用: Windows 10 但问题是,在训练几秒钟后,它停止使用GPU,并发出以下警告消息。 此外,我没有在我

  • 我想知道何时或是否必须删除此对象。下面是一个基本类对象Object.cpp的构造函数: 我知道在分配内存时,你应该在某个时候删除它,但是我在构造函数中分配了内存,并且想再次使用变量1和2,我什么时候删除它们?

  • 我在运行OSX 10.13.6的Mac上有PHP版本7.2.9。如果我加载phpinfo(),我在Safari中看到memory_limit=256M。然而,当我看php.ini(/usr/本地/php5/lib/php.ini)memory_limit=128M。这种差异的原因是什么——显然限制是在其他地方设定的,但是在哪里?我需要增加内存限制