0

我遇到了以下定义:

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

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

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

4

3 回答 3

1

有几种存储期限:

  • 静态 → 整个程序生命周期
  • 自动(堆栈)→直到当前函数结束
  • 动态(堆)→直到它明确结束(通过delete
于 2011-06-26T10:47:21.807 回答
0

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

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

可以将值存储到堆栈中,并且像 C++ 这样的语言甚至允许您将对象存储在堆栈中。一旦其封闭功能返回,它们就会“自动”被清理。

您还可以将指向存在于堆栈中的此类对象的指针存储在另一个变量中。但是您可能的意思是,通常您在堆中创建一个对象(例如,new在 Java、C++、C# 等或allocObjective-C 中通过),然后您会得到一个指向该对象的指针作为回报。

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

于 2011-06-26T10:46:03.683 回答
0

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

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

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

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


您发现的是措辞不佳的static. 不多也不少。

于 2011-06-26T10:38:07.527 回答