静态数组与C ++中的动态数组

C ++中的静态数组和动态数组有什么区别?

我必须为我的课做一个任务,它说不使用静态数组,只使用动态数组。 我已经看过这本书和网上,但我似乎不明白。

我认为静态是在编译时创建的,在运行时是动态的,但我可能会误认为是内存分配。

你能解释C ++中静态数组和动态数组之间的区别吗?


本地数组在堆栈上创建,并具有自动存储持续时间 - 您不需要手动管理内存,但是当它们所在的函数结束时它们会被销毁。 他们必须有一个固定的大小:

int foo[10];

使用operator new[]创建的数组具有动态存储持续时间并存储在堆中(技术上称为“免费存储”)。 它们可以有任何大小,但是你需要自己分配和释放它们,因为它们不是堆栈框架的一部分:

int* foo = new int[10];
delete[] foo;

静态是C和C ++中的一个关键字,所以静态在应用于变量或数组时,具有非常具体的含义,而不是一般的描述性术语。 为了增加混淆,它在不同情况下有三个不同的含义。 因此,静态数组可能是固定的或动态的。

让我解释:

首先是C ++特定的:

  • 静态类成员是一个没有用构造函数实例化或用析构函数删除的值。 这意味着成员必须被初始化并以其他方式维护。 静态成员可能会将指针初始化为空,然后在第一次调用构造函数时分配它。 (是的,这将是静态和动态的)
  • 两个从C继承而来:

  • 在一个函数中,一个静态变量是一个在函数调用之间保存其内存位置的变量。 它是静态的,它只被初始化一次,并在函数调用之间保留它的值(使用静态函数使函数不可重入,即不是线程安全)

  • 在函数之外声明的静态变量是全局变量,只能从同一个模块中访问(源代码文件与任何其他#include的文件)

  • 你想问的问题(我认为)是动态数组和固定或编译时数组之间的区别。 这是一个更简单的问题,编译时数组是事先确定的(当程序编译时)并且是函数栈帧的一部分。 它们在主函数运行之前分配。 动态数组在运行时会使用“new”关键字(或C中的malloc系列)分配,并且它们的大小事先不知道。 动态分配不会自动清除,直到程序停止运行。


    我认为你班上使用的语义是令人困惑的。 “静态”可能意味着“恒定大小”,而“动态”可能意味着“可变大小”。 那样的话,一个恒定大小的数组可能看起来像这样:

    int x[10];
    

    而“动态的”只是任何一种允许底层存储在运行时增加或减少的结构。 大多数情况下,C ++标准库中的std::vector类就足够了。 像这样使用它:

    std::vector<int> x(10); // this starts with 10 elements, but the vector can be resized.
    

    std::vector定义了operator[] ,所以你可以使用它与数组相同的语义。

    链接地址: http://www.djcxy.com/p/72917.html

    上一篇: Static array vs. dynamic array in C++

    下一篇: Why are move semantics necessary to elide temporary copies?