Folly是Facebook开源的C++库,提供高效模块化组件,适用于高性能服务。需安装依赖后通过cmake编译安装,常用功能包括fbstring字符串处理、并发工具等,使用时通过pkg-config链接。

Folly(Facebook Open-source Library)是 Facebook 开发的一个开源 C++ 库,专注于提供高效、模块化的组件,适用于高性能服务和底层系统开发。它弥补了标准库在现代 C++ 实践中的一些不足,尤其适合高并发、低延迟场景。要在项目中使用 Folly,需正确安装并理解其核心模块的用法。
安装与配置 Folly
Folly 依赖较多第三方库,编译前需确保系统环境满足要求。以下以 Ubuntu 系统为例说明安装流程:
- 安装依赖:sudo apt install git cmake g++ libboost-all-dev libevent-dev libdouble-conversion-dev libgflags-dev libgoogle-glog-dev libiberty-dev libssl-dev
- 克隆源码:git clone https://github.com/facebook/folly.git
- 进入目录并创建构建文件夹:cd folly && mkdir _build && cd _build
- 配置编译:cmake .. -DCMAKE_BUILD_TYPE=Release
- 编译并安装:make -j$(nproc) && sudo make install
完成后,Folly 默认安装到 /usr/local/,使用时需在编译命令中链接相关库,例如通过 pkg-config 获取编译参数:
g++ -std=c++17 your_file.cpp $(pkg-config --cflags --libs folly)
立即学习“C++免费学习笔记(深入)”;
常用功能与示例
Folly 提供大量实用组件,以下是几个高频使用的模块及简单示例。
1. 字符串处理(fbstring)
folly::fbstring 是 std::string 的替代品,优化了小字符串存储和内存分配性能。
#include <folly/FBString.h>
#include <iostream>
int main() {
folly::fbstring name = "Hello Folly";
std::cout << name << std::endl;
return 0;
}
2. 异步任务与 Future/Promise
folly::Future 和 folly::Promise 提供了链式异步编程模型,比 std::future 更灵活。
#include <folly/futures/Future.h>
#include <thread>
#include <iostream>
int main() {
auto promise = folly::Promise<int>{};
auto future = promise.getFuture();
std::thread t([p = std::move(promise)]() mutable {
std::this_thread::sleep_for(std::chrono::seconds(1));
p.setValue(42);
});
future.thenValue([](int val) {
std::cout << "Received: " << val << std::endl;
}).wait();
t.join();
return 0;
}
3. 高性能容器(如 F14 哈希表)
folly::F14FastMap 是高性能哈希表实现,比 std::unordered_map 更快。
#include <folly/container/F14Map.h>
#include <iostream>
int main() {
folly::F14FastMap<std::string, int> ages;
ages["Alice"] = 25;
ages["Bob"] = 30;
for (const auto& [name, age] : ages) {
std::cout << name << ": " << age << std::endl;
}
return 0;
}
4. 并发工具(Synchronized)
folly::Synchronized
#include <folly/Synchronized.h>
#include <thread>
#include <vector>
folly::Synchronized<std::vector<int>> data;
void add_values() {
for (int i = 0; i < 100; ++i) {
data.withLock([&](auto& vec) { vec.push_back(i); });
}
}
int main() {
std::thread t1(add_values);
std::thread t2(add_values);
t1.join(); t2.join();
std::cout << "Total size: " << data.rlock()->size() << std::endl;
return 0;
}
基本上就这些。Folly 功能丰富,建议根据实际需求查阅官方文档选择合适模块。集成时注意版本兼容性和构建配置,避免运行时链接错误。掌握核心组件后,可显著提升 C++ 项目的性能和开发效率。











