После многих испытаний я нашел ответ на свои вопросы с помощью следующего кода:
#include <vector>
#include <chaiscript/chaiscript.hpp>
std::vector<int> create_big_structure() {
//This is 1GB in size.
return std::vector<int>(268435456);
}
std::vector<int> update_structure(int i, const std::vector<int>& data) {
//This is 1GB in size.
return std::vector<int>(268435456);
}
void output_data_evolution(const std::vector<int>& data, const std::vector<int>& new_data) {}
int main() {
chaiscript::ChaiScript chai;
chai.add(chaiscript::fun(&create_big_structure), "create_big_structure");
chai.add(chaiscript::fun(&update_structure), "update_structure");
chai.add(chaiscript::fun(&output_data_evolution), "output_data_evolution");
chai.add(chaiscript::bootstrap::standard_library::vector_type<std::vector<int>>("VectorInt"));
chai.eval(R"(
var max = 5;
var data = create_big_structure();
for (var i = 1; i < max; ++i)
{
var new_data = update_structure(i, data);
output_data_evolution(data, new_data);
data = new_data;
}
)");
}
Я запустил код с помощью MSVC и посмотрел статистику времени выполнения, чтобы выяснить, что произошло в ОЗУ: Статистика времени выполнения
Код работает разумно. После фазы запуска 1 ГБ ОЗУ выделяется для объекта data
. В цикле ОЗУ остается на 2 ГБ, потому что у нас также есть объект new_data
. После цикла он падает до 1 ГБ.
Поэтому ответы на мои вопросы:
- chaiscript действительно удаляет данные после каждого цикла оператора for.
- chaiscript также удаляет данные после циклов.
- Да, вам нужно убедиться, что функции c ++ не создают ненужных данных. Например, если вы пишете с копией вместо ссылки -
update_structure(int i, std::vector<int> data)
, то функция будет использовать копию данных, и, следовательно, объем оперативной памяти в цикле увеличится до 3 ГБ.
- chaiscript не удаляет неиспользуемые данные внутри одного и того же блока. (
new_data
удаляется после цикла, но не data
.)