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库仍然在运行。在机器翻译场景中(这在今天或多或少是常见的),这是一种悲观。(我认为小字符串优化是目前最先进的技术。)我需要一个副本,因为函数修改字符串内容。你是说该方法修改了副本,但放弃了结果吗?那么,为什么不通过引用在本地进行复制呢?