限制c ++中的字符串大小?

时间:2010-09-06 07:06:16

标签: c++

我有一百万条记录,每个大约30个字符通过套接字进入。我可以把它全部读成一个字符串吗?我可以分配的字符串大小是否有限制?

如果是这样,我是否可以通过记录在套接字记录上发送数据并按记录接收记录。直到运行时我才知道每条记录的大小。

8 个答案:

答案 0 :(得分:20)

回答第一个问题:C ++字符串的最大大小由string::max_size

给出

答案 1 :(得分:8)

std::string::max_size()将告诉您程序运行的架构所施加的理论限制。除此之外,只要您有足够的RAM和/或磁盘交换空间,就可以拥有巨大的std::strings。 你的第二个问题的答案是肯定的,你可以按记录发送记录,而且你可能无法同时通过套接字发送大块数据 - 单个发送操作的大小有限制。直到运行时不知道单个字符串的大小是不是一个问题,在编译时不需要知道它是否通过套接字发送它们。如何按记录实际发送这些字符串取决于您正在使用的套接字/网络库;请参阅相关文档。

答案 2 :(得分:3)

c ++中字符串大小的唯一实际限制是可用内存。话虽如此,在您继续接收数据时将字符串重新分配到正确的大小是很昂贵的(假设您事先不知道它的总大小)。通常,您会将数据块读取到固定大小的缓冲区中,并在获取时将其解码为自然形状(您的记录)。

答案 3 :(得分:3)

字符串的大小仅受程序可用内存量的限制,它更多地是操作系统限制而不是C ++限制。 C ++ / C字符串以空值终止,因此字符串例程将很快处理极长的字符串,直到它们找到空值。

在Win32上,可用于数据的最大内存量通常约为2 Gigs。

您可以从套接字中读取任意大量的数据,但您必须有一些方法来分隔您正在读取的数据。必须有与您正在读取的记录关联的记录标记或长度的结束,因此使用它来解析记录。你真的想把数据读成一个字符串吗?如果没有足够的可用内存来保存RAM中的数据,会发生什么?我怀疑有一种更有效的方法来处理这些数据,但我对这个问题知之甚少。

答案 4 :(得分:2)

字符串的大小没有官方限制。该软件会询问您的系统内存,只要它得到它,就可以在字符串中添加字符。

你的其余问题不明确。

答案 5 :(得分:1)

理论上,没有。但是不要去分配100GB的内存,因为用户可能没有那么多内存。如果您使用std :: strings,那么max size是std :: string :: npos。

答案 6 :(得分:0)

如何以不同的格式发送它们?

在您的服务器中: 发送(strlen的(szRecordServer)); 发送(szRecordServer);

在你的客户: 的recv(cbRecord); ALLOC(szRecordClient); 的recv(szRecordClient);

并重复这一百万次。

答案 7 :(得分:-1)

如果我们谈论的是char*你在32位系统上使用smth约2 ^ 32,而使用2 ^ 64(惊讶)64位系统

更新:这是错误的。见评论