C++ 流如何为输入分配空间?

标签 c++ stream dynamic-memory-allocation

例如:

// is  type: std::istream
// str type: std::string
is >> str;

这如何增加 str 以适应输入?它逐字符读取并调用 str.push_back() (或类似的东西)?或者它是否具有在读取输入之前了解输入大小的机制?


我意识到标准很可能没有指定这些细节,但我对常见的实现更感兴趣(例如 gcc)。

这个问题很奇怪,因为在 C 中你事先不知道要为字符串分配多少(当然是 C 风格的字符 vector ),但 C++ 会为你管理。

请注意,这不是关于动态内存的 C++ 管理的问题,而是关于在将读取输入读入缓冲区/变量之前是否知道读取输入的大小的问题。当然,在那条注释中,如果 str 已经足够大,则不会发生重新分配,但这不是这里的重点。

最佳答案

您可以找到 libstdc++ 的实现 here .

如您所见,它使用一个包含 128 个字符的数组作为缓冲区,并按顺序将字符读入缓冲区,直到缓冲区填满或到达要读取的字符串的末尾。如果缓冲区已满,则将字符附加到字符串并重新使用缓冲区。因此一次将 128 个字符追加到字符串中,但可能在最后一次追加操作期间除外。流确实无法提前知道要读取多少个字符。字符串的内存分配策略与流不耦合。

关于C++ 流如何为输入分配空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27763488/

相关文章:

c++ - C++中增量垃圾收集模拟的内存分配

c# - 将文件写入磁盘后无法执行文件

python - 如何在 Python 3 中将文本流编码为字节流?

c - 如果在 C 中使用 malloc((size_t)NULL) 会发生什么

C++ chrono - 将持续时间作为 float 或 long long

c++ - 天真的把 C++ 翻译成 Julia,有优化的空间吗?

c - 静态动态内存是否会在程序结束时自动释放?

c - malloc 是动态内存分配吗?

c++ - 用于初始化派生类型的通用 switch 语句

node.js - 如何从没有格式的FFmpeg获取标准输出?