Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以传递给函数的最大字符串长度(或大小)是多少?_C++_String - Fatal编程技术网

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

C++ 我可以传递给函数的最大字符串长度(或大小)是多少?,c++,string,C++,String,我有以下功能: int Foo(string sentence); 我想知道我能通过的最大字符串长度是多少? 我认为这应该取决于分配给函数的堆栈大小,因为这个字符串将被复制到堆栈中,是这样吗?或者它取决于字符串::max_size值? 我在VS2010下使用C++,WiNoWS7/P> 编辑。当函数修改字符串内容时,我需要一个副本。将std::string对象复制到堆栈上,但字符串体不会复制到堆栈上-它将在堆上分配。实际限制取决于系统和程序内存使用情况,在32位系统上可能是1000万到10亿个

我有以下功能:

int Foo(string sentence);
我想知道我能通过的最大字符串长度是多少? 我认为这应该取决于分配给函数的堆栈大小,因为这个字符串将被复制到堆栈中,是这样吗?或者它取决于字符串::max_size值? 我在VS2010下使用C++,WiNoWS7/P>
编辑。当函数修改字符串内容时,我需要一个副本。

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

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

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

如果它还依赖于非常依赖于运行时的东西,比如堆栈大小,那么您可能无法找到答案


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

您可以检查
std::string
max_size()
成员函数

编辑


如果您的标准库实现没有实现写时复制优化,您应该通过常量引用传递大字符串。如果您希望独立于STL,这也是正确的。

它不能超过取决于实现的
max\u size()

然而,最好的做法是引用它

int Foo(string& sentence);

最大字符串长度很可能由系统约束决定,而不是由
max\u size
返回的理论最大值决定
max_size
on,但在现实世界中,您永远无法在32位Windows框上构造这样大小的字符串


在任何给定的连接点上可以使用的最大大小都会有所不同,并且(在考虑
字符串的对象大小之后)可能与当时可能的最大连续堆分配相同。这受机器配置(多少RAM、多少内核保留空间、多少其他程序及其内存配置文件)的影响。如果您随后尝试执行任何需要堆内存的操作,您将得到一种或另一种类型的异常。你最好先不要接近这个场景。

字符串::max_size是真的吗?是你唯一可以依赖的东西。请注意。通过值传递,因为Ahmed(在对答案的评论中)说无论如何都需要一个副本。请给出解决问题的答案。或者,如果您找到了解决方案,请回答您自己的问题。我知道这一点,但我将在函数中修改此字符串,因此我需要一个copymax_size,它不会告诉您任何有用的信息。max_size()给出了OP问题的答案,前提是STL的实现是正确的。只有当您始终可以创建小于max_size()的字符串副本时,这才是正确的,但您不能。答案的后半部分只有在您并不总是需要副本的情况下才是正确的,但OP说这里不是这样。您可以做的唯一安全的假设是,无法创建大于max_size()的字符串。您只能通过实例化来检查是否可以创建大小为n的字符串。@Simone:我很惊讶std库仍然在运行。在机器翻译场景中(这在今天或多或少是常见的),这是一种悲观。(我认为小字符串优化是目前最先进的技术。)我需要一个副本,因为函数修改字符串内容。你是说该方法修改了副本,但放弃了结果吗?那么,为什么不通过引用在本地进行复制呢?