【问题标题】:What is the difference between static and dynamic memory allocation?静态和动态内存分配有什么区别?
【发布时间】:2017-03-03 02:11:00
【问题描述】:

我看到了这段代码:

int n;
cin>>n;
int c[n];

和这个有什么区别

int *c=new int[n];

【问题讨论】:

标签: c++ dynamic-memory-allocation


【解决方案1】:

第一个在 c++ 中无效,因为在编译时需要知道大小,因为您的数据将存储在堆栈中,而且它的范围有限。

后者在堆上为你的对象分配内存,并且会一直持续到手动删除或程序执行停止。

【讨论】:

    【解决方案2】:

    在第一个例子中:

    int n;
    cin >> n;
    int c[n];
    

    这段代码简单地声明了一个变量n,从用户那里接受一个存储在n中的整数值,并声明一个大小为n的整数数组。

    这里的问题是,如果你的编译器不支持,你的代码中不能有一个可变长度的数组,因为这在 c++ 中是不允许的。然而,现代编译器,如更高版本的 gcc 编译器,支持可变大小的数组,因此,允许可变数组克服了 c++ 不支持它们的障碍。

    我不知道支持变量数组的gcc编译器的所有版本,但我试过gcc 4.6.3版本,它支持变量数组。

    现在,继续您的第二个示例,

    int *c = new int[n];
    

    这是一个完全不同的概念。这里,int *c 分配内存来保存一个 int 类型的元素。然后new int [n] 在 int 类型的内存中分配一个包含 n 个元素的块,第一个元素的地址存储在 c 中。因此, c 指向一个 5 个整数的数组。如需进一步阅读,请访问:Dynamic Memory

    【讨论】:

      【解决方案3】:

      第一个例子

      在第一个示例中,您实例化了一个名为可变长度数组的东西。 VLA 未在 C++ 标准中定义,因此它们不属于该语言。它们有时由各种编译器作为扩展启用。

      VLA 具有自动存储持续时间,这意味着这样的数组在代码块的开头分配并在末尾释放。

      通常它们被分配在堆栈上(如果它们适合的话),但不能保证。所以再次通常与发生在堆上的动态内存分配(第二个示例)相比,它们将具有更小的分配/释放成本。

      另外通常 VLA 允许在它们上使用sizeof 并且sizeof(VLA) 通常 返回array_size * sizeof(type)。对于应用了编译标志 -std=c++14gcc 也是如此。

      您可能注意到了很多通常 - 问题是,由于 VLA 不是由 C++ 标准定义的,因此您必须深入了解它们对您使用的编译器的规范。所以 C++ 的最佳实践 - 不要使用 VLA

      第二个例子

      在您的第二个示例中,您执行动态内存分配。完成后,c 指向新分配的内存块的开头,大小为n * sizeof(int) 字节。

      c 具有动态存储持续时间,这意味着它由您分配并且必须由您解除分配(在这种情况下使用delete[] c

      如上所述,堆上的分配/解除分配成本较高。

      注意:

      在 C++ 中,您应该尽可能使用std::vector<T>。它更安全,可以随着您添加新元素而增长,而且速度不会特别慢。

      【讨论】:

      • 我可以从 downvoter 那里得到解释,以便我可以更正我的答案吗?
      • 如果编译器支持,为什么使用 VLA 会出现问题?现代编译器正在接受 VLA,因为它对程序员来说更方便。
      • @ABusyProgrammer 描述了无法使用标准 C++ 实现的 VLA 用例,或者在没有 VLA 的情况下实现时具有真正的缺点。当你当前的实现不适合堆栈时会发生什么?你确定吗?您确定当您尝试使用不同的编译器(假设它支持 VLA)编译代码时,行为不会改变吗?它还告诉新接触该语言的人这是有效的 C++。我们应该尽可能教新人使用vector。当他们有更多经验时,他们可以决定是否要使用非标准功能
      猜你喜欢
      • 2012-01-13
      • 2023-03-07
      • 1970-01-01
      • 2019-06-18
      • 2020-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-17
      相关资源
      最近更新 更多