я должен использовать статическое или динамическое распределение памяти в этой программе? - PullRequest
0 голосов
/ 29 октября 2019

Я пишу программу, чтобы получить все простые числа до числа n (ввод).

Теперь в этой программе я использовал статическое распределение памяти int arr[n+1], однако мой компилятор не знаетзначение n во время компиляции (n предоставляется пользователем как ввод) и, следовательно, не знает, сколько места должно быть выделено.

Следует ли использовать динамическое выделение памяти в этой программе?

int *arr=new int[n+1]

Однако в обоих случаях программа работает отлично.

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

void prime(int n) {
  int arr[n + 1]; // <=======

  for (int i = 0; i < n + 1; i++) {
    arr[i] = 1;
  }

  for (int i = 2; i <= n; i++) {
    for (int j = 2 * i, l = 0; j < n + 1; j = (2 + l) * i, l++) {
      arr[j] = 0;
    }
  }

  for (int i = 2; i < n + 1; i++) {
    if (arr[i] == 1) {
      cout << i << " ";
    }
  }
}

int main() {
  int n;
  cin >> n;
  prime(n);
}

1 Ответ

0 голосов
/ 29 октября 2019

Это

void prime(int n) {
  int arr[n + 1]; // <=======

не является статическим распределением. Это динамическое распределение стека, и оно известно как массив переменной длины. Что не разрешено C ++, даже если все (большинство?) Компиляторы принимают такой код. Для получения дополнительной информации читайте здесь: Почему массивы переменной длины не являются частью стандарта C ++?

В любом случае, практическое правило: использовать динамическое куча распределение, когда(а) вам требуется, чтобы какой-то объект жил «долго» (т. е. дольше, чем сам вызов функции), или (б) вам нужно много памяти, или (в) у вас есть коллекция переменной длины (даже если есть способы динамического выделениястековая память, например, alloca , я считаю, что это микрооптимизация и сложно работать - избегайте, если возможно).

Также вы можете использовать std :: vector . Он также использует динамическое распределение кучи под капотом, но в целом безопаснее, чем ручной new/delete.

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