通常,静态对象是由编译器在编译时“创建”的。它在程序退出方面的行为可能因语言而异。例如,在 C 中,根本没有特殊处理(AFAIK 对于 Objective-C 也是如此)。通常这些对象“存在”在编译器创建并“附加”到程序的只读内存区域中。当程序加载到内存中时,这个只读区域被映射到程序的内存中,这是一个非常快的操作。例如,printf("I'm a static string.");
C 中的所有静态字符串(如 )都以这种方式处理。
然后是堆栈,也就是调用堆栈和堆栈。一般来说,堆栈只是一种数据结构,也就是 LIFO(后进先出)。调用堆栈确实是由操作系统创建的,并且通常在大小上是有限的。它存储了函数调用所需的所有信息。这意味着对于每个函数调用,它的参数和其他信息都被“推送”到堆栈(放在堆栈顶部),并为函数变量保留了一点空间。一旦函数返回,所有这些东西都被删除,只剩下返回值(尽管这并不总是正确的,通常返回值是在 CPU 寄存器中传递的)。
您可以将值存储到堆栈中,并且像 C++ 这样的语言甚至允许您将对象存储在堆栈中。一旦其封闭功能返回,它们就会“自动”被清理。
您还可以将指向存在于堆栈中的此类对象的指针存储在另一个变量中。但是您可能的意思是,通常您在堆中创建一个对象(例如,new
在 Java、C++、C# 等或alloc
Objective-C 中通过),然后您会得到一个指向该对象的指针作为回报。
回到开头:静态对象在编译时为编译器所知,但与堆和堆栈有关的所有内容根据定义只有在运行时才知道。