После того, как я недавно столкнулся с той же проблемой, я придумал следующее решение:
Сначала найдите все 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
});
});
Существует простая причина, почему емкость строки на единицу меньше, чем вы ожидаете, и это
s.c_str()
Строка C ++ хранится в блоке памяти с емкостью, дающей общий размер и размер за использованное пространство. Но строка C завершается 0. Строка C ++ резервирует один дополнительный байт в конце блока памяти для хранения 0. Таким образом, s.c_str()
всегда завершается 0.
Таким образом, память, используемая динамической частью строки, равна емкости + 1.
Что касается общего объема памяти, занятой строкой или вектором строк, Натан Оливер ответил, что я думаю. Но остерегайтесь векторов, содержащих одну и ту же строку несколько раз.
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