我有以下功能:
int Foo(string sentence);
我想知道我可以通过的最大字符串长度是多少? 我认为它应该依赖于分配给函数的堆栈大小,因为这个字符串将被复制到堆栈中,是真的吗?或者它取决于string :: max_size值? 我在VS2010,windows7
下使用C ++EDIT。我需要有一个副本,因为函数会修改字符串内容。
答案 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);