首页 > 解决方案 > C++17 std::from_chars 和 std::to_chars 的用途?

问题描述

在 C++17 之前,存在多种将整数、浮点数和双精度数与字符串转换的方法。例如, std::stringstreamstd::to_stringstd::atoistd::stoi和其他可以用来完成这些任务。对此,有很多帖子讨论这些方法之间的差异。

但是,C++ 17 现在引入了std::from_charsstd::to_chars. 为此,我想知道引入另一种与字符串相互转换的方法的原因。

一方面,这些新功能与以前的方法相比有哪些优势和功能?

不仅如此,这种新的字符串转换方法有什么明显的缺点吗?

标签: c++stringlanguage-lawyerc++17

解决方案


std::stringstream是重量级冠军。它考虑了流的灌输 locale之类的东西,它的功能涉及在格式化操作期间构造一个哨兵对象等东西,以处理与异常相关的问题。C++ 库中的格式化输入和输出操作以重量级和速度慢而著称

std::to_string没有那么密集,std::istringstream但它仍然返回 a std::string,它的构造可能涉及动态分配(现代短字符串优化技术不太可能,但仍然可能)。而且,在大多数情况下,编译器仍然需要在调用站点生成所有的措辞,以支持一个std::string对象,包括它的析构函数。

std::to_chars设计为尽可能少的占用空间。您提供缓冲区,std::to_chars除了以特定格式将数值实际格式化到缓冲区之外,几乎没有做任何事情,没有任何特定于语言环境的考虑,唯一的开销是确保缓冲区足够大。使用的代码std::to_chars不需要做任何动态分配。

std::to_chars在格式化选项方面也更加灵活,尤其是浮点值。std::to_string没有格式化选项。

std::from_chars同样,它是一个轻量级解析器,不需要进行任何动态分配,也不需要牺牲任何电子来处理语言环境问题或流操作的开销。


推荐阅读