静态对象与堆栈 - &基于堆的对象

时间:2011-06-26 10:29:53

标签: static stack heap

我遇到了以下定义:

static对象是从构造和创建到程序结束时存在的对象。因此排除了基于堆栈和堆的对象。程序退出时会破坏静态对象,即在main完成执行时调用它们的析构函数。

为什么排除基于堆栈和堆的对象?

以下是我对堆栈和堆的了解:堆栈是系统内存的一部分,其中所有变量都存储在运行时之前。堆是系统存储器的一部分,其中所有变量都在运行时存储,例如,动态分配内存。这意味着如果我在代码中声明一个整数变量i并为其分配say 123的值,那么它将存储在我的堆栈中,因为编译器在编译期间知道该值(在运行时之前)。但是如果我定义一个指针变量并希望在其他地方初始化它,那么它将存储在我的堆中,因为在编译时编译器不知道它。

3 个答案:

答案 0 :(得分:2)

有几个存储持续时间:

  • 静态→整个程序生命周期
  • 自动(堆叠)→直到当前功能结束
  • 动态(堆)→直到它明确结束(通过delete

答案 1 :(得分:1)

通常,编译器在编译时“创建”静态对象。它对程序退出的行为可能在不同语言之间有所不同。例如,在C中,根本没有特殊处理(而AFAIK对于Objective-C也是如此)。这些对象通常“存在”只读存储器区域,编译器创建并“附加”到程序中。当程序加载到内存中时,此只读区域将映射到程序的内存中,这是一种非常快速的操作。例如,C中的所有静态字符串(如printf("I'm a static string.");)都被这样处理。

然后是 堆栈,又称调用堆栈,以及 堆栈。一般来说,堆栈只是一种数据结构,即LIFO(后进先出)。调用堆栈确实由OS创建,并且通常在大小上受限。它存储函数调用所需的所有信息。这意味着对于每个函数调用,其参数和其他信息被“推送”到堆栈(放在堆栈顶部),并保留一些函数变量空间。一旦函数返回,所有这些东西都被删除,只留下返回值(尽管这并不总是如此,通常返回值在CPU寄存器中传递)。

可以将值存储到堆栈中,而C ++等语言甚至允许您在堆栈中存储对象。一旦其封闭函数返回,它们就会“自动”清理。

您也可以存储指向生活在堆栈中的此类对象的指针。但你可能意味着通常你在堆中创建一个对象(例如通过Java,C ++,C#等中的new或Objective-C中的alloc)然后你得到一个指向该对象的指针。

回到开始:编译时编译器知道静态对象,但是根据定义,与堆和堆栈有关的所有内容只在运行时中知道。

答案 2 :(得分:0)

  

“静态对象是从构造和创建到程序结束时存在的对象。因此排除基于堆栈和基于堆的对象。”

     

为什么排除基于堆栈和堆的对象???

它们被“排除”,因为它们从构建和创建到程序结束时都存在。

这些都与您在第2段中所写/理解的内容相矛盾,尽管根据您所谈论的编程语言可能存在细微差别。


你发现的是对static的措辞不合理的定义。没什么,没什么。