Должны ли мы объявлять вектор как константу глобально или передавать его в рекурсивную функцию, чтобы уменьшить использование памяти? - PullRequest
0 голосов
/ 23 июня 2019

Мне нужно использовать векторный массив в рекурсивной функции.Должен ли я объявить этот вектор как постоянный глобально или напрямую передать его из главной функции в c ++?Какой подход рекомендуется?Первый подход потребляет меньше памяти, чем второй?В каждом рекурсивном вызове создается отдельная копия векторного массива?

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

1-й подход

const vector<int> array = {1,2,3,4,5};
void fun(int index)
{
       // some ending condition

      // only access array(no modification)

      // recusive call
      fun(index+1);
}

int main()
{
  fun(a,0);

 return 0;
}

2-й подход

void fun(vector<int> &array,int index)
{
       // some ending condition

       // only access array(no modification)

      // recusive call
      fun(array,index+1);
}

int main()
{
  vector<int> a = {1,2,3,4,5};
  fun(a,0);

  return 0;
}

1 Ответ

1 голос
/ 23 июня 2019

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

Вы можете реорганизовать свой код, чтобы использовать вместо него class, указав vector в качестве члена.

Использование глобальной переменной экономит много памяти, но это такой анти-паттерн, приводящий к серьезным проблемам, которые необходимо избегать, когда это возможно.

EDIT

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

...