Вычислить выделенную память для std :: string (и использовать строки в std :: vector)

После того, как я недавно столкнулся с той же проблемой, я придумал следующее решение:

Сначала найдите все ItemTags, где tagName либо «смешно», либо «политика» и возвращает массив ItemTag _ids.

Затем найдите элементы, которые содержат все ItemTag _ids в массиве тегов

ItemTag
  .find({ tagName : { $in : ['funny','politics'] } })
  .lean()
  .distinct('_id')
  .exec((err, itemTagIds) => {
     if (err) { console.error(err); }
     Item.find({ tag: { $all: itemTagIds} }, (err, items) => {
        console.log(items); // Items filtered by tagName
     });
  });
1
задан huzzm 17 January 2019 в 15:07
поделиться

2 ответа

Существует простая причина, почему емкость строки на единицу меньше, чем вы ожидаете, и это

s.c_str()

Строка C ++ хранится в блоке памяти с емкостью, дающей общий размер и размер за использованное пространство. Но строка C завершается 0. Строка C ++ резервирует один дополнительный байт в конце блока памяти для хранения 0. Таким образом, s.c_str() всегда завершается 0.

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

Что касается общего объема памяти, занятой строкой или вектором строк, Натан Оливер ответил, что я думаю. Но остерегайтесь векторов, содержащих одну и ту же строку несколько раз.

0
ответ дан Goswin von Brederlow 17 January 2019 в 15:07
поделиться
1110] На этот вопрос будет сложно ответить. Наивно вы могли бы подумать, что общий объем потребляемой памяти будет

vector_capacity * sizeof(std::string) + sum_of_capacity_of_each_string_in_the_vector

Но это скорее верхний предел, а не то, что можно было бы фактически использовать. Например, оптимизация короткой строки позволяет std::string хранить строковые данные в хранилище, которое использует сам строковый объект (то, что вы называете статическим размером). Если это так, то фактическое использованное пространство будет равно

vector_capacity * sizeof(std::string)

, а емкость каждой строки в векторе будет просто количеством места, которое вы занимаете без выделения дополнительного пространства. Вам нужно будет проверить свою реализацию, чтобы увидеть, использует ли она SSO и длинную строку, которую он будет хранить в строковом объекте, чтобы узнать, использует ли значение емкости внутреннее пространство строк или фактически использует дополнительную память. Это приводит к фактическому потреблению пространства.

vector_capacity * sizeof(std::string) + sum_of_capacity_of_each_string_in_the_vector_where_
                                        the_capcity_is_more_than_the_sso_amount

. В вашем расчете sizeof(cache[i].at(0)) нет необходимости. std::string Использование char и sizeof(char) гарантированно будет 1

0
ответ дан NathanOliver 17 January 2019 в 15:07
поделиться
Другие вопросы по тегам:

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