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

时间:2015-01-04 07:41:14

标签: c++ stream dynamic-memory-allocation

例如:

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

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


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

这个问题是好奇心,因为在C中你事先并不知道为字符串分配多少(当然是C字形的字符向量),但C ++会为你管理。

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

1 个答案:

答案 0 :(得分:5)

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

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