c++ - C++17 std::from_chars 和 std::to_chars 的用途?
问题描述
在 C++17 之前,存在多种将整数、浮点数和双精度数与字符串转换的方法。例如, std::stringstream
、std::to_string
、std::atoi
、std::stoi
和其他可以用来完成这些任务。对此,有很多帖子讨论这些方法之间的差异。
但是,C++ 17 现在引入了std::from_chars
和std::to_chars
. 为此,我想知道引入另一种与字符串相互转换的方法的原因。
一方面,这些新功能与以前的方法相比有哪些优势和功能?
不仅如此,这种新的字符串转换方法有什么明显的缺点吗?
解决方案
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
同样,它是一个轻量级解析器,不需要进行任何动态分配,也不需要牺牲任何电子来处理语言环境问题或流操作的开销。
推荐阅读
- python - 在系统 python 上运行 pipenv 脚本
- reactjs - ExcelJs 使用 typescript 添加常用样式功能
- c# - 值不能为空。(参数'connectionString')第一次运行迁移时
- swift - 应用转移iOS Swift后用户是否需要重新安装我的应用
- video-streaming - Playready 许可证的标准生命周期
- amazon-web-services - 如何使用 eb 的 cli 工具将部署策略更新为不可变?
- r - 基础问题:如何使用 R 将列表向量转换为表格?
- swift - 将更改发布到可观察对象的集合
- php - Woocommerce 5.4.1:如何将 Hook 添加到存档页面上的特定帖子 - 商店页面
- python - Julia 中一维随机游走的直方图