2010-11-29 41 views
3

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

int Foo(string sentence); 

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

+0

是string :: max_size一个真实的东西? – sje397 2010-11-29 13:28:27

+0

是你唯一可以依赖的东西。 – Simone 2010-11-29 13:36:35

+2

请注意,[通常你应该采取字符串参数每`const`参考](http://stackoverflow.com/questions/2139224/2139254#2139254)。 – sbi 2010-11-29 13:43:20

回答

6

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

2

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

0

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

如果它也依赖于像堆栈大小这样的依赖于运行时的东西,那么您可能无法找到答案。不用说,最好将(长)字符串作为常量引用传递,以避免任何复制。

1

您可以检查std::stringmax_size()成员函数。

编辑

如果你的标准库实现不执行写时复制的优化,你应当经常引用大串。如果你想独立于STL,也是如此。

0

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

然而,最好的做法是将参考传递给它。

int Foo(string& sentence); 
1

它更可能是最大字符串长度会被你的系统比max_size返回的理论最大值的约束来确定。 max_size on Windows 32-bit is 4 GB,但是你将永远无法在32位Windows盒子上构建一个尺寸在现实世界中的字符串。

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

相关问题