在C++17之前,有多种方法可以将整数、浮点数和双值转换到字符串和字符串之间。例如,可以使用std::stringstream、std::to_string、std::atoi、std::stoi和其他工具来完成这些任务。对此,有大量的文章讨论这些方法的不同之处。
然而,C++ 17现在已经引入了std::from_chars和std::to_chars。为此,我想知道引入另一种转换字符串的方法的原因。
首先,与以前的方法相比,这些新函数提供了哪些优势和功能?
不仅如此,这种新的字符串转换方法有什么明显的缺点吗?
发布于 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是一个轻量级解析器,它不需要进行任何动态分配,也不需要牺牲任何电子来处理区域设置问题或流操作开销。
发布于 2019-04-27 00:43:18
to/from_chars被设计为基本的字符串转换函数。相对于其他选择,它们有两个基本优势。
constexpr (虽然我不知道为什么),但是更多的重量级分配和/或抛出版本不能。float/double转换为一个字符串(没有指定的精度),则需要实现该实现,以便将这个精确的字符序列转换回一个float/double,从而生成一个二进制的相同值。你不能从snprintf、stringstream或to_string/stof那里得到这种保证。
但是,只有当to_chars和from_chars调用使用相同的实现时,这种保证才是好的。因此,您不能期望通过Internet将字符串发送到可能使用不同标准库实现编译的其他计算机,并获得相同的float。但它确实为你提供了计算机串行化的保证。发布于 2019-04-26 23:14:28
所有这些预先存在的方法都是以所谓的地区为基础的。区域设置基本上是一组格式选项,这些选项指定哪些字符可计数为数字,哪些符号用于小数点,哪些千位分隔符可使用,等等。然而,很多时候,你并不真的需要这样做。如果您只是读取JSON文件,您知道数据是以特定的方式格式化的,因此没有理由在每次看到'.'时都查找是否应该是小数点。<charconv>中引入的新函数基本上是硬编码的,可以根据默认C语言环境设置的格式来读取和写入数字。没有办法更改格式,但由于格式不一定是灵活的,所以它们可以是非常快的…
https://stackoverflow.com/questions/55875862
复制相似问题