Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在函数范围内的堆栈上分配的数组在离开函数时是否总是被解除分配?_C++_G++_Allocation - Fatal编程技术网

C++ 在函数范围内的堆栈上分配的数组在离开函数时是否总是被解除分配?

C++ 在函数范围内的堆栈上分配的数组在离开函数时是否总是被解除分配?,c++,g++,allocation,C++,G++,Allocation,假设我有以下代码: #include <iostream> void f() { int arr[10]; } int main() { f(); f(); } #包括 void f(){ int-arr[10]; } int main(){ f(); f(); } 一旦我们离开f()的作用域,数组arr是否会被释放,即使我们将再次调用它?另外,如果我们只调用f()一次,我假设它在离开f()的范围时被释放,但是如果我错了,请有人纠正我 我也意识到这可能是与编译器相关

假设我有以下代码:

#include <iostream>
void f() {
  int arr[10];
}

int main() {
  f();
  f();
}
#包括
void f(){
int-arr[10];
}
int main(){
f();
f();
}
一旦我们离开
f()
的作用域,数组
arr
是否会被释放,即使我们将再次调用它?另外,如果我们只调用
f()
一次,我假设它在离开
f()
的范围时被释放,但是如果我错了,请有人纠正我


我也意识到这可能是与编译器相关的问题,所以我将g++作为一个标记。谢谢。

概念上确实如此,因为
arr
具有自动存储持续时间。(例如,如果要返回指向该数组元素的指针,则在调用方中取消引用该指针的行为将是未定义的。)

编译器是否根据“仿佛”规则选择适当的优化是另一回事

当g++设置为-O3时,您可以期望整个程序被编译为
intmain(){}
。如果有任何疑问,请检查生成的程序集


参考资料:

你没有错。每次调用函数时都会分配数组,每次函数结束时都会取消分配数组。尽管堆栈上的分配/取消分配基本上是免费的。此外,使用
int
数组,您甚至不需要为在元素上运行的构造函数付费。

再加上@Bhathsheba所说的,每当您超出范围时,内存(堆栈)不会自动失效,只是您可以根据其他要求自由删除堆栈。如果没有其他进程在运行,那么堆栈可能不会被删除。所以这要视情况而定。

谢谢你的回复。我之所以问这个问题,是因为我正在初始化一个函数中的多个数组,这个函数会被调用数千次,我想知道,如果让这些数组是静态的,这样当函数离开时它们就不会被释放,这会加快进程,是不是更好。这似乎是个好主意吗?在堆栈上分配/自动存储持续时间通常不是一个昂贵的过程。通常它需要寄存器的增量。@堆栈上内存的分配只是将堆栈指针进一步移动。如果对象未初始化,则不需要额外的工作。@JohnnyD27:绝对不要像这样过早地进行优化。使它们成为静态的可能是有害的:例如,您可能会破坏线程模型
thread\u local
可能只是稍微好一点,两者都有自己的开销。如果您认为自动阵列是一个性能瓶颈,那么就使用分析工具。这很有意义。因此,我将保留在堆栈上分配的数组。谢谢大家。“如果没有其他进程在运行,那么堆栈可能不会被删除”-您能对此进行一点扩展吗?听起来很有趣。@TedLyngmo我可能错了,但我认为Sai意味着一旦我们离开函数的作用域,堆栈上数组的数据可能不会被清除,即使该空间现在可以被某些进程使用。我想说的是,如果你不需要数组,就不要创建数组,这是在浪费时间,您为数组分配了内存,但从未对它做过任何操作,如果您想知道哪种方法更好,您需要告诉我们您将如何处理数组。因为从目前的情况来看,最好的办法是在f中什么都不做,去掉arr[10]中最有效的一行。@YunfeiChen你的评论似乎与我的问题无关。我的问题不是基于函数的功能。我正在使用该代码以更直观的方式说明我的问题。需要知道的是,在某个函数的堆栈上分配了一个数组,一旦我们离开该函数的作用域,就不会返回任何内容。您还指定了一些关于“哪种方法更好”的内容,但我没有提到不同的方法,因此我不太理解您的意思。问题是,如果您不告诉我数组是什么,那么很难告诉您什么更好,您是否计划稍后与它们进行合并排序,或者您是否计划使用heapSort,或者您是否计划创建一些更高维度的数组,动态或非动态,这实际上取决于使用情况……您再次说“什么更好”,但我没有提到任何不同的方法。我不确定你是否理解我的问题。我要问的是,一旦我们离开函数的作用域,即使再次调用函数,在函数堆栈上分配的数组是否会被释放。函数中发生了什么并不重要。如果我在函数中的数组上运行排序算法,它是完全不相关的。查看接受的答案以了解更多信息。好吧,你问了“谢谢你的答复。我之所以问这个问题,是因为我正在初始化一个函数中的多个数组,这个函数会被调用数千次,我想知道,如果让这些数组是静态的,这样当函数离开时它们就不会被释放,这会加快进程,是不是更好。这是个好主意吗?“在你的回答中,我只是觉得我需要对此发表评论。。。。