静态对象与堆栈
我遇到以下定义:
static
对象是从构建和创建时开始直到程序结束时存在的对象。 因此排除基于堆栈和堆的对象。 当程序退出时,静态对象被销毁,也就是说,当main
执行完成时,它们的析构函数被调用。
为什么排除基于堆栈和堆的对象?
以下是我所了解的堆栈和堆栈:堆栈是系统内存中运行时间之前存储所有变量的部分。 堆是系统内存中运行时存储所有变量的部分,例如动态分配的内存。 这意味着如果我在我的代码中声明一个整数变量i
并为它指定123
的值,那么它将被存储在我的堆栈中,因为编译器在编译期间(运行时间之前)知道该值。 但是,如果我定义了一个指针变量并想将它初始化到其他地方,那么它将存储在我的堆中,因为编译器在编译时不知道它。
通常,编译器会在编译时“创建”一个静态对象。 它对程序退出的行为可能会因语言而异。 例如,在C中,根本没有特殊处理(对于Objective-C,AFAIK也是如此)。 这些对象通常在编译器创建并“附加”到程序的只读存储区中“存活”。 当程序加载到内存中时,这个只读区域被映射到程序的内存中,这是一个非常快速的操作。 例如,C中的所有静态字符串(如printf("I'm a static string.");
)都是这样处理的。
然后是堆栈,又名调用堆栈和堆栈。 一般来说,堆栈只是一个数据结构,也叫LIFO(后进先出)。 调用堆栈确实是由OS创建的,并且通常大小有限。 它存储了函数调用所需的全部信息。 这意味着对于每个函数调用,其参数和其他信息被“推送”到堆栈(放在堆栈的顶部),并为函数变量保留一点空间。 一旦函数返回,所有这些东西都被删除,只剩下返回值(尽管这并非总是如此,通常返回值是通过CPU寄存器传递的)。
您可以将值存储到堆栈,像C ++这样的语言甚至允许您将对象存储在堆栈中。 一旦封闭函数返回,它们就会自动“清理”。
你也可以在另一个变量中存储一个指向这个对象的指针。 但你大概的意思是,你通常在堆中创建一个对象(例如,通过new
使用Java,C ++,C#等,或者alloc
中的Objective-C),你会得到一个指向对象的回报。
回到开始:编译时编译器知道静态对象,但所有与堆和堆栈有关的事情只能在运行时才知道。
有几种储存时间:
delete
) “静态对象是从构建和创建时开始直到程序结束时才存在的对象,因此基于堆栈和堆的对象因此被排除在外。”
为什么排除基于堆栈和堆的对象?
它们被“排除”,因为它们在构建和创建之前并不存在,直到程序结束。
这与你在第二段中写的/理解的内容相矛盾,尽管根据你所说的编程语言的不同,可能会有细微差别。
你发现的是一个措辞不佳的static
定义。 没有更多,没有更多。