我有以下功能:
int Foo(string sentence);
我想知道我可以通过的最大字符串长度是多少?我认为它应该依赖于分配给函数的堆栈大小,因为这个字符串将被复制到堆栈中,是真的吗?或者它取决于string :: max_size值?我在VS2010,windows7下使用C ++
编辑。我需要有一个副本,因为该函数修改了字符串内容。
std::string
对象将被复制到堆栈中,但字符串正文将不会 - 它将在堆上分配。实际的限制将取决于系统和程序的内存使用情况,并且可能类似于32位系统上的一千万到十亿字符。
它与堆栈大小没有任何关系 - 字符串内容在堆上分配。所以它取决于string :: max_size或你的计算机中有多少RAM /虚拟内存。
你可以查看std::string
的max_size()
会员功能。
编辑
如果您的标准库实现没有实现Copy On Write优化,那么您应该通过const引用传递大字符串。如果您想独立于STL,也是如此。
最大字符串长度更有可能由系统的约束决定,而不是max_size
返回的理论最大值。 max_size
上的Windows 32-bit is 4 GB,但你永远无法在32位Windows机器上构建一个在现实世界中大小的字符串。
您可以在任何给定时刻使用的最大大小会有所不同,并且很可能(在考虑string
的对象大小之后)与该时刻可能的最大连续堆分配相同。这受机器配置的影响(RAM多少,内核预留空间多少,其他程序有多少以及它们的内存配置文件)。如果您然后尝试执行需要堆内存的任何其他操作,您将获得一种或另一种类型的异常。你最好不要首先接近这种情况。
它永远不会超过string::max_size
,因为它返回实现支持的最大长度。
如果它还依赖于与运行时相关的东西,比如堆栈大小,那么你可能无法找到它。
不用说,最好将(长)字符串作为常量引用传递,以避免任何复制。
它不能超过max_size()
,它是依赖于实现的。
但最佳做法是传递对它的引用。
int Foo(string& sentence);