我可以传递给函数的最大字符串长度(或大小)是多少?

时间:2010-11-29 13:24:04

标签: c++ string

我有以下功能:

int Foo(string sentence);

我想知道我可以通过的最大字符串长度是多少? 我认为它应该依赖于分配给函数的堆栈大小,因为这个字符串将被复制到堆栈中,是真的吗?或者它取决于string :: max_size值? 我在VS2010,windows7

下使用C ++

EDIT。我需要有一个副本,因为函数会修改字符串内容。

6 个答案:

答案 0 :(得分:6)

std::string对象将被复制到堆栈中,但字符串体不会 - 它将在堆上分配。实际的限制将取决于系统和程序的内存使用情况,在32位系统上可能会有一千万到十亿个字符。

答案 1 :(得分:2)

它与堆栈大小没有任何关系 - 字符串内容在堆上分配。因此,它取决于string :: max_size或您计算机中可用的RAM /虚拟内存。

答案 2 :(得分:1)

您可以查看std::string的{​​{1}}会员功能。

修改

如果标准库实现没有实现Copy On Write优化,则应该通过const引用传递大字符串。如果您想独立于STL,也是如此。

答案 3 :(得分:1)

最大字符串长度更有可能由系统的约束决定,而不是max_size返回的理论最大值。 Windows 32-bit is 4 GB上的max_size,但您永远无法在32位Windows框中构建现实世界中的字符串。

您可以在任何给定时刻使用的最大大小会有所不同,并且很可能(在考虑string的对象大小之后)与该时刻可能的最大连续堆分配相同。这受机器配置的影响(RAM多少,内核预留空间多少,其他程序有多少以及它们的内存配置文件)。如果您然后尝试执行需要堆内存的任何其他操作,您将获得一种或另一种类型的异常。你最好不要在第一时间接近这种情况。

答案 4 :(得分:0)

永远不会超过string::max_size,因为它返回实现支持的最大长度。

如果它还依赖于非常依赖于运行时的东西,比如堆栈大小,你可能无法找到它。

毋庸置疑,最好将(长)字符串作为常量引用传递,以避免任何复制。

答案 5 :(得分:0)

它不能超过max_size(),这取决于实现。

但最佳做法是传递对它的引用。

int Foo(string& sentence);