
在C++17中,std::to_chars 和 std::from_chars 被引入为一种更高效、更安全的数字与字符串之间转换的方式。它们位于头文件
为什么选择 std::to_chars 和 std::from_chars?
传统的字符串转换方法如 std::to_string、std::stoi、sprintf 或 stringstream 存在一些问题:
- 可能抛出异常(如 stoi 在转换失败时)
- 依赖全局 locale 设置
- 性能较低,尤其是 stringstream 的格式化开销大
- 使用堆内存或内部缓冲区,不够可控
std::to_chars / from_chars 避开了这些问题,通过直接操作字符缓冲区实现零开销抽象。
std::to_chars:数字转字符串
该函数将数值写入用户提供的字符缓冲区,不进行内存分配。
立即学习“C++免费学习笔记(深入)”;
std::to_chars(char* first, char* last, T value)参数说明:
- first:缓冲区起始地址
- last:缓冲区末尾地址(不包含)
- value:要转换的数值(支持整型和浮点型)
返回值类型是 std::to_chars_result,包含 ptr(指向转换后下一个位置)和 ec(错误码)。
示例:
char buffer[32];auto result = std::to_chars(buffer, buffer + sizeof(buffer), 12345);
if (result.ec == std::errc()) {
*result.ptr = '\0'; // 添加字符串结束符
printf("结果: %s\n", buffer);
}
支持进制指定(仅限整型):
std::to_chars(..., 255, 16); // 转换为十六进制std::from_chars:字符串转数字
从字符序列中解析数值,同样无异常、无内存分配。
std::from_chars(const char* first, const char* last, T& value)参数说明:
- first:起始字符指针
- last:结束字符指针(不包含)
- value:输出变量,存放解析结果
返回 std::from_chars_result,包含 ptr(已处理的下一个位置)和 ec(错误码)。
示例:
const char* str = "42";int value;
auto result = std::from_chars(str, str + std::strlen(str), value);
if (result.ec == std::errc()) {
std::cout } else if (result.ec == std::errc::invalid_argument) {
std::cout } else if (result.ec == std::errc::result_out_of_range) {
std::cout }
同样支持进制解析:
std::from_chars(str, end, value, 16); // 按十六进制解析性能优势与使用建议
这两个函数通常比传统方法快很多,尤其是在循环中频繁转换时。原因包括:
- 避免了内存分配和释放
- 不依赖 iostream 的复杂格式化逻辑
- 编译器可以更好地优化
- 错误处理通过返回码,避免异常开销
使用建议:
- 预分配足够大的缓冲区用于 to_chars(例如32字节对整数足够)
- 始终检查返回的 error code
- 在高并发或实时系统中优先使用,替代 sprintf/sscanf
- 注意浮点数支持因标准库实现而异(libc++ 和 MSVC 支持较好,libstdc++ 在较新版本才完善)
基本上就这些。std::to_chars 和 std::from_chars 是现代 C++ 数字转换的推荐方式,尤其在追求性能和确定性行为的场合表现优异。











