Какова максимальная длина строки (или размер), которую я могу передать функции? - PullRequest
5 голосов
/ 29 ноября 2010

У меня есть следующая функция:

int Foo(string sentence);

Я хочу знать, какую максимальную длину строки я могу передать?Я думаю, что это должно зависеть от размера стека, выделенного для функции, так как эта строка будет скопирована в стек, это правда?или это зависит от значения string :: max_size?Я использую C ++ под VS2010, Windows7

РЕДАКТИРОВАТЬ.Мне нужно иметь копию, так как функция изменяет содержимое строки.

Ответы [ 6 ]

7 голосов
/ 29 ноября 2010

Объект std::string будет скопирован в стек, но тело строки не будет скопировано - оно будет размещено в куче. Фактическое ограничение будет зависеть от использования системы и памяти программы и может составлять примерно от десяти миллионов до одного миллиарда символов в 32-разрядной системе.

2 голосов
/ 29 ноября 2010

Вы можете проверить std::string max_size() функцию члена.

EDIT

Если ваша стандартная реализация библиотеки не реализует оптимизацию копирования при записи, вы должны передавать большие строки по константной ссылке. Это также верно, если вы хотите быть независимым от STL.

2 голосов
/ 29 ноября 2010

Это не имеет никакого отношения к размеру стека - содержимое строки назначается в куче.Так что это зависит либо от string :: max_size, либо от того, сколько оперативной / виртуальной памяти у вас есть на вашем компьютере.

1 голос
/ 29 ноября 2010

Скорее всего, максимальная длина строки будет определяться ограничениями вашей системы, чем теоретическое максимальное значение, возвращаемое max_size. max_size на 32-битная Windows - это 4 ГБ , но вы никогда не сможете создать строку такого размера в реальном мире на 32-битной Windows-системе.

Максимальный размер, который вы можете использовать в любой данный момент, будет варьироваться и, вероятно, будет (после учета размера объекта string) совпадать с самым большим выделением непрерывной кучи, которое возможно в этот момент. Это зависит от конфигурации машины (сколько оперативной памяти, сколько зарезервировано для ядра, сколько других программ и их профиль памяти). Если вы затем попытаетесь сделать что-либо еще, требующее кучи памяти, вы получите исключения того или иного типа. Во-первых, вам лучше не приближаться к этому сценарию.

0 голосов
/ 29 ноября 2010

Это не может быть больше, чем max_size(), что зависит от реализации.

Однако лучше всего передать ссылку на него.

int Foo(string& sentence);
0 голосов
/ 29 ноября 2010

Оно никогда не будет больше string::max_size, поскольку это возвращает максимальную длину, поддерживаемую реализацией.

Если это также зависит от очень зависящих от времени выполнения вещей, таких как размеры стека, вы, вероятно, не сможете это выяснить.

Само собой разумеется, лучше передавать (длинные) строки как константы, чтобы избежать копирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...