【问题标题】:Is there any difference between static memory allocation and automatic memory allocation? [duplicate]静态内存分配和自动内存分配有什么区别吗? [复制]
【发布时间】:2023-03-07 12:05:02
【问题描述】:

我正在阅读有关静态内存分配和动态内存分配的信息。静态内存基本上是int a = 2;,其中a 的空间在堆栈上分配。但如果我这样做了,int * a = new int; *a = 3,这里的内存是在堆上分配的。但是,前者也可以称为自动内存分配吗?谢谢!

【问题讨论】:

  • “前”是两条指令。你的意思是int * a = new int;int * 变量有自动分配
  • 阅读storage duration

标签: c++


【解决方案1】:

忘记堆栈和堆。这些术语在 C++ 标准中没有定义(堆栈展开和std::stack 等内容除外)。你说的是存储时长,可以是:

  • 静态
  • 线程
  • 自动
  • 动态

动态存储持续时间应用于使用new 创建的对象。此类对象将一直存在,直到您 delete 他们为止。

Automatic 适用于未声明 staticextern 的块范围变量,例如函数中的局部变量。当块结束时,它们会自动(恰当地)销毁。

线程用于声明 thread_local 的变量。它们存在直到创建它们的线程结束。

Static 用于其他任何东西,通常是在文件范围内或使用 static 关键字声明的变量。此类变量在项目期间存在。

【讨论】:

  • 明白了,但只是问一下,当我使用new分配内存时,它是在堆上分配的,而当我选择自动时,它是在堆栈上分配的,对吗?
  • 没有。当您使用new 进行分配时,内存是使用free store 分配的。当你有自动存储时,它可以在堆栈上,它可以被优化出来,它可以存储在一个寄存器中......
  • 作为一个实际问题(合理架构上的常见行为),考虑自动分配在堆栈中是有用的,而newmalloc 的分配在堆中是有用的。您应该知道该标准并未强制执行此操作。但是了解常见行为仍然可以帮助您更好地编码,并作为标准规定的行为的近似值。
猜你喜欢
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 2014-10-03
  • 1970-01-01
  • 2018-12-29
  • 2020-10-03
  • 1970-01-01
  • 2020-08-12
相关资源
最近更新 更多