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

问题描述 投票:4回答:6

我有以下功能:

int Foo(string sentence);

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

编辑。我需要有一个副本,因为该函数修改了字符串内容。

c++ string
6个回答
6
投票

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


2
投票

它与堆栈大小没有任何关系 - 字符串内容在堆上分配。所以它取决于string :: max_size或你的计算机中有多少RAM /虚拟内存。


1
投票

你可以查看std::stringmax_size()会员功能。

编辑

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


1
投票

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

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


0
投票

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

如果它还依赖于与运行时相关的东西,比如堆栈大小,那么你可能无法找到它。

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


0
投票

它不能超过max_size(),它是依赖于实现的。

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

int Foo(string& sentence);
© www.soinside.com 2019 - 2024. All rights reserved.