首页 > 解决方案 > 我应该在这个程序中使用静态还是动态内存分配?

问题描述

我正在编写一个程序来获取所有素数到一个数字 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);
}

标签: c++dynamic-memory-allocation

解决方案


这个

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

不是静态分配。这是一个动态堆栈分配,它被称为可变长度数组。即使所有(大多数?)编译器都接受这样的代码,但 C++ 不允许这样做。有关更多信息,请在此处阅读:为什么可变长度数组不是 C++ 标准的一部分?

无论如何,经验法则是:当(a)您需要某个对象“长时间”生存(即比函数调用本身更长)或(b)您需要大量内存或(c)您有变量时,请使用动态分配长度集合(即使仍然有动态分配堆栈内存的方法,例如alloca,我认为它是一种微优化并且难以使用 - 如果可能,请避免使用)。

您也可能想利用std::vector。它在后台也使用动态堆分配,但通常比手动更安全new/delete


推荐阅读