автоматическое освобождение памяти после использования - PullRequest
0 голосов
/ 21 сентября 2018

Есть много мест, где я получил такой код:

some_function_signature() 
{
    T a;
    T b = f1(a);
    T c = f2(b);
    T d = f3(c);
    ...
}

Как вы можете видеть, в такой функции a передается в f1() для получения b, затемb передано f2() для получения c и так далее.Эти переменные не будут использоваться после вызова функции (f1,f2,f3 ...).И они содержат большую память (например, T - это большие данные изображения). Проблема здесь в том, что в этой функции накопленное потребление памяти может быть большим, и я бы хотел уменьшить это.Ожидание деструктора T для освобождения памяти сделает пиковое использование памяти some_function_signature() очень большим.

Я могу сделать что-то подобное, чтобы освободить память после использования:

some_function_signature() 
{
    T a;
    T b = f1(a); a.free();
    T c = f2(b); b.free();
    T d = f3(c); c.free();
    ...
}

Интересно, смогу ли я сделать этот процесс автоматическим и более элегантным. Например, процесс управления памятью с определенными областями или использование подсчета ссылок, но я просто не знаю, как лучше применить эти методы здесь.

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Вы можете попробовать что-то вроде этого:

T d; 
{
    T c; 
    {   
        T b; 
        {   
            T a; 
            b = f1(a); 
        } //a goes out of scope and is destroyed here 
        c = f1(b); 
    } //b goes out of scope and is destroyed here
    d = f3(c);  
}//c goes out of scope and is destroyed here
0 голосов
/ 21 сентября 2018

Это похоже на случай семантики перемещения.Убедитесь, что T и f1/2/3 поддерживают семантику перемещения, и измените пример на

some_function_signature() 
{
    T a;
    T b = f1(std::move(a));
    T c = f2(std::move(b));
    T d = f3(std::move(c));
    ...
}

. Это позволит T f1(T&& t) перерабатывать перемещенное изображение.

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