Сколько строка занимает памяти

Обновлено: 06.07.2024

Кто знает, подскажите.

Если я в D2007 описываю строку st: string, то память под строку выделяется сразу какой-то фикс.длины, а потом увеличивается при увеличении содержимого строки или же память сразу не выделяется вовсе, а распределяется при записи в нее символов?

Т.о. чем больше я загоню текста в свою строку, тем больше она станет занимать места в оперативке?

И еще вопрос: иногда при увеличении динамического массива выдает "Out of memory", хотя оперативки на ПК очень много и явно превышения не должно быть.

m52
И еще вопрос: иногда при увеличении динамического массива выдает "Out of memory", хотя оперативки на ПК очень много и явно превышения не должно быть.

32-битному процессу, если не использовать специального флага, доступно всего 2GB адресного пространства. Ну и возможность выделения больших блоков памяти зависит о эффективности работы менеджера памяти и степени фрагментированности кучи. В общем, может быть ситуация, когда общий размер свободной памяти достаточно большой, но непрерывного блока требующегося размера нет.

Меня интересует такой вопрос:

Можно ли вообще узнать, сколько осталась RAM в куче для распределения под динамические массивы, переменные, строки и т.п.?

Можно ли вообще узнать, сколько осталась RAM в куче для распределения под динамические массивы, переменные, строки и т.п.?

А зачем это знать ? Д
Динамическая память - это куча.
Представь себе кусок сыра с дырками.
Если ты захочешь отрезать из этого куска кусок, в котором вообще нет дырок, то ты его там, вполне возможно, и найдёшь,
но он будет мааааленький-маленький.
А если захочешь отрезать кусок без дырок побольше, то его там не найдётся, одни дырки.
И казалось бы, вот он кусок сыра, режь его, а - нечего.

У меня элементы массива это довольно увесистые структурки record.

Даже лучше будет для каждой record-структуры выделять/уничтожать память через New/Dispose.
А хранить указатели на выделенную память в динамическом массиве указателей.
Таким образом, память для каждой record-структуры будет выделяться в куче в разных местах, т.е. не будет требовать непрерывного куска памяти (разве что непрерывный кусок памяти нужен будет под динам.массив указателей, которые по размеру маленькие).

Тогда наверное сильно уменьшается вероятность ошибки "Out of memory", которую выдаст только при переполнении кучи.

Даже лучше будет для каждой record-структуры выделять/уничтожать память через New/Dispose.
А хранить указатели на выделенную память в динамическом массиве указателей.
Таким образом, память для каждой record-структуры будет выделяться в куче в разных местах, т.е. не будет требовать непрерывного куска памяти (разве что непрерывный кусок памяти нужен будет под динам.массив указателей, которые по размеру маленькие).

Тогда наверное сильно уменьшается вероятность ошибки "Out of memory", которую выдаст только при переполнении кучи.

При создании строки не помешало бы указать её длину и ёмкость (или хотя бы знать эти параметры).

Длина std::string

size_type string::length() const

size_type string::size() const

Обе эти функции возвращают текущее количество символов, которые содержит строка, исключая нуль-терминатор. Например:

Хотя также можно использовать функцию length() для определения того, содержит ли строка какие-либо символы или нет, эффективнее использовать функцию empty():

bool string::empty() const — эта функция возвращает true , если в строке нет символов, и false — в противном случае.

std :: cout << ( sString1 . empty ( ) ? "true" : "false" ) << std :: endl ; std :: cout << ( sString2 . empty ( ) ? "true" : "false" ) << std :: endl ;

Есть еще одна функция, связанная с длиной строки, которую вы, вероятно, никогда не будете использовать, но мы все равно её рассмотрим:

size_type string::max_size() const — эта функция возвращает максимальное количество символов, которое может хранить строка. Это значение может варьироваться в зависимости от операционной системы и архитектуры операционной системы.

Ёмкость std::string

size_type string::capacity() const — эта функция возвращает количество символов, которое может хранить строка без дополнительного перераспределения/перевыделения памяти.

std :: cout << "Capacity: " << sString . capacity ( ) << std :: endl ;

Length: 10
Capacity: 15

Примечание: Запускать эту и следующие программы следует в полноценных IDE, а не в веб-компиляторах.

Обратите внимание, ёмкость строки больше её длины! Хотя длина нашей строки равна 10, памяти для неё выделено аж на 15 символов! Почему так?

Здесь важно понимать, что, если пользователь захочет поместить в строку больше символов, чем она может вместить, строка будет перераспределена и, соответственно, ёмкость будет больше. Например, если строка имеет длину и ёмкость равную 10, то добавление новых символов в строку приведет к её перераспределению. Делая ёмкость строки больше её длины, мы предоставляем пользователю некоторое буферное пространство для расширения строки (добавление новых символов).

Но в перераспределении есть также несколько нюансов:

Во-первых, это сравнительно ресурсозатратно. Сначала должна быть выделена новая память. Затем каждый символ строки копируется в новую память. Если строка большая, то тратится много времени. Наконец, старая память должна быть удалена/освобождена. Если вы делаете много перераспределений, то этот процесс может значительно снизить производительность вашей программы.

Во-вторых, всякий раз, когда строка перераспределяется, её содержимое получает новый адрес памяти. Это означает, что все текущие ссылки, указатели и итераторы строки становятся недействительными!

Обратите внимание, не всегда строки создаются с ёмкостью, превышающей её длину. Рассмотрим следующую программу:

Может ли кто-нибудь сказать мне, сколько байтов займет строка ниже?

Он занимает 17 байт в источнике. пожалуйста, уточните свой вопрос еще раз. вы думаете в памяти во время выполнения, когда кодируется в byte [], . Достаточно немного, чтобы вы действительно не беспокоились об этом :-)

3 ответа

Я подозреваю, что это было написано до того, как у меня появилась возможность работать с 64-битной CLR; Я подозреваю, что в 64-битной среде каждая строка занимает еще 4 или 8 байтов.

Что ж, это делает строки очень непопулярными, если вы хотите хранить их в памяти большое количество . Я предположил, что константа «20» - это размер внутренних деталей строкового объекта, не связанных с содержимым строки. Я только что нашел ваше объяснение, что null занимает 2 байта в строке. Я предполагаю, что 20 на самом деле '18 + 2 для нулевого значения', и поэтому пустая строка и 1-символьная строка будут занимать одинаковое количество памяти.

По сути, каждый строковый объект требует константы 20 байтов для данных объекта. Буфер требует 2 байта на символ. Оценка использования памяти для строки в байтах: 20 + (2 * Длина). Итак, обычно память в CLR для этой строки: 22 байта

Однако пока мы передаем или отправляем эту строку на другой конец или при любом другом использовании, нам не нужно столько памяти (нам никогда не нужны 20 байтов для данных объекта). Так что это зависит от типа кодировки, которую вы выбираете при ее использовании.

Для кодировки по умолчанию для символа потребуется 1 байт.

Таким образом, ответ составляет 1 байт для кодировки по умолчанию.

Вы можете проверить этот код:

Это не имеет значения. Это зависит от типа кодировки, которую вы выбираете, когда вы их используете.

Если вы спрашиваете о размере объекта string , то неправильно спрашивать о его размере, без отладчика невозможно сказать, что именно это такое. Не уверен, что это возможно и с отладчиком. string использует указатели внутри.

Если вы спросите о размере последовательности символов, которую он содержит, то он равен 4, потому что строки хранятся в UTF-16. Все символы в Basic Multilingual Plane кодируются двумя байтами.

Я знаю, что это очень простой вопрос. Я прочитал управление памятью из Википедии и пару страниц MSDN. Но все же я не уверен, как происходит обработка ниже во время выполнения программы.

Когда я объявляю длинную строку в своей программе

1 ответ

Есть ли способ узнать, сколько памяти мой поток java занимает в VM? Например, используя дамп stack trace или какие-то другие средства. Спасибо

Я думаю, что между брауэрами может быть разница, но как узнать, сколько памяти занимает массив или один его элемент в Javascript? Я хочу выяснить, сколько места я экономлю при использовании типизированного массива. Заранее спасибо!

Как вам уже говорили многие люди, существует множество способов представления строки. Самое распространенное, что нужно сделать, - это сохранить строку в виде массива. Однако вам нужна дополнительная информация: длина этого массива.

Каждый (процедурный или императивный) язык решает эту проблему по-разному.

Там "pascal строк", где первые несколько байтов массива хранят длину строки.

Существуют строки "C string или null-terminated strings", в которых нет дополнительных байтов для хранения длины, но последний байт в массиве имеет нулевое значение.

В COM используется гибридный подход, BSTR. Он использует 4 байта в начале для хранения длины строки и двухбайтовый маркер (два нулевых байта) в конце. Это позволяет передать строку в C процедур и в то же время быстро получить длину.

Функциональные языки-это совершенно другое хранилище.

Для хранения многомерного (в вашем случае двумерного) массива необходимо "linearize", т. Е. Превратить его в одномерный массив, чтобы использовать аппаратное обеспечение памяти компьютера.

Поэтому для хранения

вы выделяете по крайней мере

байты памяти для хранения данных. Доступ к A[i][j] осуществляется путем доступа к байтам памяти по адресу

Это два подхода, используемые C и Fortran.

Однако, если вам нужно сохранить некоторую разреженную матрицу, могут быть и другие варианты. Вы можете, например, хранить тройки (i,j,значение), представляющие ненулевые элементы матрицы.

Похожие вопросы:

Сколько памяти занимает отпечаток ноги обычной нити в java. Предполагая, что нет никакого объекта, связанного с ним.

Как бы я выяснил, сколько памяти занимает операция? Например: memory_start = memory() reader = csv.reader(file) memory_end = memory() memory_of_reader = math.abs(memory_end - memory_start)

Если я увеличу свой пул потоков Tomcat с N до N+1 потоков, сколько дополнительной памяти это займет? Конечно, мое приложение может отвечать за некоторую дополнительную память,но давайте.

Есть ли способ узнать, сколько памяти мой поток java занимает в VM? Например, используя дамп stack trace или какие-то другие средства. Спасибо

Я думаю, что между брауэрами может быть разница, но как узнать, сколько памяти занимает массив или один его элемент в Javascript? Я хочу выяснить, сколько места я экономлю при использовании.

Есть ли какой-нибудь простой способ проверить, сколько памяти занимает какой-то массив? Как будто у меня есть массив из 10 тысяч строк, и мне нужно знать, сколько МБ/КБ требуется серверу, чтобы.

Мне просто интересно, если у меня есть переменная и я назначаю ей Nothing (или Null ), сколько памяти занимает эта переменная? Например Dim i as Integer = Nothing Разве переменная не использует.

Я пишу алгоритм сортировки, где я могу использовать только стеки. Увеличивая количество стеков, я могу выполнять сортировку с меньшим количеством операций. Во всяком случае, предположим, что у меня.

Мне нужно решить, буду ли я использовать enum s в большом массиве, который мне нужен в моем проекте. Для этого мне нужно знать, каков размер переменной enum . enum Player < First, Second, Third.

Читайте также: