我有以下功能:我可以传递给函数的最大字符串长度(或大小)是多少?
int Foo(string sentence);
我想知道什么是最大字符串长度我能过去吗? 我认为它应该取决于分配给该函数的堆栈大小,因为这个字符串将被复制到堆栈,这是真的吗?或者它取决于string :: max_size的值? 我在VS2010下使用C++,windows7
我有以下功能:我可以传递给函数的最大字符串长度(或大小)是多少?
int Foo(string sentence);
我想知道什么是最大字符串长度我能过去吗? 我认为它应该取决于分配给该函数的堆栈大小,因为这个字符串将被复制到堆栈,这是真的吗?或者它取决于string :: max_size的值? 我在VS2010下使用C++,windows7
std::string
对象将被复制到堆栈,但字符串主体不会 - 它将被分配在堆上。实际的限制将取决于系统和程序内存的使用情况,并且可以是32位系统上的一千万到十亿个字符之类的东西。
它与堆栈大小没有任何关系 - 字符串内容被分配在堆上。所以它取决于string :: max_size或你的计算机有多少RAM /虚拟内存。
它永远不会超过string::max_size
,因为它会返回实现支持的最大长度。
如果它也依赖于像堆栈大小这样的依赖于运行时的东西,那么您可能无法找到答案。不用说,最好将(长)字符串作为常量引用传递,以避免任何复制。
您可以检查std::string
的max_size()
成员函数。
编辑
如果你的标准库实现不执行写时复制的优化,你应当经常引用大串。如果你想独立于STL,也是如此。
它不能超过max_size()
这是依赖于实现。
然而,最好的做法是将参考传递给它。
int Foo(string& sentence);
它更可能是最大字符串长度会被你的系统比max_size
返回的理论最大值的约束来确定。 max_size
on Windows 32-bit is 4 GB,但是你将永远无法在32位Windows盒子上构建一个尺寸在现实世界中的字符串。
您可以在任何特定时刻使用的最大大小会有所不同,并且很可能(在考虑到string
的对象大小后)与当时可能的最大连续堆分配相同。这受机器配置(多少RAM,多少内核预留空间,多少其他程序及其内存配置文件)的影响。如果你尝试去做任何需要堆内存的东西,你会得到一种或另一种类型的异常。首先,您最好不要接近这种情况。
是string :: max_size一个真实的东西? – sje397 2010-11-29 13:28:27
是你唯一可以依赖的东西。 – Simone 2010-11-29 13:36:35
请注意,[通常你应该采取字符串参数每`const`参考](http://stackoverflow.com/questions/2139224/2139254#2139254)。 – sbi 2010-11-29 13:43:20