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.