静态对象与堆栈

我遇到以下定义:

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定义。 没有更多,没有更多。

    链接地址: http://www.djcxy.com/p/79083.html

    上一篇: static objects vs. stack

    下一篇: How to know object creation is on heap or not..?