例如:
// is type: std::istream
// str type: std::string
is >> str;
这是怎么长出来的str
适应输入?它逐个字符地读取并调用str.push_back()
(或类似的东西)?或者它是否有一种机制可以在读取输入之前了解输入大小?
我意识到标准很可能没有指定这些细节,但我对常见的实现更感兴趣(例如gcc
).
这个问题很有趣,因为在 C 中你事先不知道要为字符串分配多少空间(当然是 C 风格的字符向量),但 C++ 会为你管理它。
请注意,这不是关于 C++ 动态内存管理的问题,而是关于在将读取输入读入缓冲区/变量之前是否知道其大小的问题。当然,在该注释中,如果str
已经足够大了,不会发生重新分配,但这不是重点。
你可以找到libstdc++的实现here https://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a00999_source.html#l00996.
正如您所看到的,它使用一个 128 个字符的数组作为缓冲区,并按顺序将字符读入缓冲区,直到缓冲区填满或到达要读取的字符串的末尾。如果缓冲区已满,则将字符附加到字符串并重用缓冲区。因此,一次会向字符串附加 128 个字符,但可能在最后一次附加操作期间除外。流确实无法知道将提前读取多少个字符。字符串的内存分配策略不与流耦合。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)