首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++17目的std::from_chars和std::to_chars?

C++17目的std::from_chars和std::to_chars?
EN

Stack Overflow用户
提问于 2019-04-26 23:05:29
回答 3查看 8.2K关注 0票数 26

在C++17之前,有多种方法可以将整数、浮点数和双值转换到字符串和字符串之间。例如,可以使用std::stringstreamstd::to_stringstd::atoistd::stoi和其他工具来完成这些任务。对此,有大量的文章讨论这些方法的不同之处。

然而,C++ 17现在已经引入了std::from_charsstd::to_chars。为此,我想知道引入另一种转换字符串的方法的原因。

首先,与以前的方法相比,这些新函数提供了哪些优势和功能?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-04-26 23:22:10

std::stringstream是重量级冠军。为了处理与异常相关的问题,它考虑到了诸如流的灌入地区之类的内容,它的功能涉及格式化操作期间的构造哨兵目标。C++库中的格式化输入和输出操作对于作为重量级人物,动作缓慢有一定的声誉。

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

std::to_chars被设计成尽可能少的占用空间。您提供了缓冲区,而std::to_chars除了以特定格式将数字值实际格式化为缓冲区之外,没有任何特定于区域设置的注意事项,只需要确保缓冲区足够大的唯一开销。使用std::to_chars的代码不需要进行任何动态分配。

std::to_chars在格式选项方面也更灵活一些,特别是浮点值。std::to_string没有格式设置选项。

类似地,std::from_chars是一个轻量级解析器,它不需要进行任何动态分配,也不需要牺牲任何电子来处理区域设置问题或流操作开销。

票数 32
EN

Stack Overflow用户

发布于 2019-04-27 00:43:18

to/from_chars被设计为基本的字符串转换函数。相对于其他选择,它们有两个基本优势。

  1. 它们重量轻得多。他们从不分配内存(你给他们分配内存)。他们从不抛出异常。他们也从来不看地区,这也提高了性能。 基本上,它们的设计使得在API级别上不可能有更快的转换功能。 这些函数甚至可以是constexpr (虽然我不知道为什么),但是更多的重量级分配和/或抛出版本不能。
  2. 他们有明确的往返保证。如果您将一个float/double转换为一个字符串(没有指定的精度),则需要实现该实现,以便将这个精确的字符序列转换回一个float/double,从而生成一个二进制的相同值。你不能从snprintfstringstreamto_string/stof那里得到这种保证。 但是,只有当to_charsfrom_chars调用使用相同的实现时,这种保证才是好的。因此,您不能期望通过Internet将字符串发送到可能使用不同标准库实现编译的其他计算机,并获得相同的float。但它确实为你提供了计算机串行化的保证。
票数 23
EN

Stack Overflow用户

发布于 2019-04-26 23:14:28

所有这些预先存在的方法都是以所谓的地区为基础的。区域设置基本上是一组格式选项,这些选项指定哪些字符可计数为数字,哪些符号用于小数点,哪些千位分隔符可使用,等等。然而,很多时候,你并不真的需要这样做。如果您只是读取JSON文件,您知道数据是以特定的方式格式化的,因此没有理由在每次看到'.'时都查找是否应该是小数点。<charconv>中引入的新函数基本上是硬编码的,可以根据默认C语言环境设置的格式来读取和写入数字。没有办法更改格式,但由于格式不一定是灵活的,所以它们可以是非常快的…

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55875862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档