C++ 后进先出的真正含义是什么?

C++ 后进先出的真正含义是什么?,c++,stack,computer-science,C++,Stack,Computer Science,如本教程所述: 在计算机编程中,堆栈是一个容器,用于容纳其他对象 变量(非常类似于数组)。然而,数组允许 以您希望的任何顺序访问和修改元素,堆栈更为重要 有限的。可以在堆栈上执行的操作是相同的 以上各项: 1) 查看堆栈上的顶部项(通常通过函数完成) 调用top())2)从堆栈中取出顶部项(通过 函数名为pop())3)将新项放在堆栈顶部(通过 一个名为push()的函数 但是如果我在C++中定义了两个变量,我不必用相同的定义顺序使用它们: 例如: int main() { int a;

如本教程所述:

在计算机编程中,堆栈是一个容器,用于容纳其他对象 变量(非常类似于数组)。然而,数组允许 以您希望的任何顺序访问和修改元素,堆栈更为重要 有限的。可以在堆栈上执行的操作是相同的 以上各项:

1) 查看堆栈上的顶部项(通常通过函数完成) 调用top())2)从堆栈中取出顶部项(通过 函数名为pop())3)将新项放在堆栈顶部(通过 一个名为push()的函数

但是如果我在C++中定义了两个变量,我不必用相同的定义顺序使用它们:

例如:

int main() {
 int a;
 int b;

 b = 5;
 a = 6;
}
这个代码有问题吗?我可以按我喜欢的顺序使用它们!!我不必先使用a,然后再使用b


我是不是误解了什么?这是什么?

您混淆了两种不同的堆栈

一个堆栈是为应用程序分配部分内存的地方。这将是关于堆栈和堆以及内存分配位置的讨论的一部分


另一种堆栈是符合后进先出方式访问的数据结构。这可以使用std::vector或其他形式的数据结构来实现。

堆栈是一种到处使用的标准数据结构。线程的所谓堆栈实际上就是这个范例的一个实现。有一个堆栈指针(通常在处理器寄存器中)指向内存位置。通过移动sp将数据“推”到此堆栈上。我们通过返回数据所指向的值并将sp反向移动来“弹出”

就你上面所说的a,b而言,没有区别。它们都是在使用前分配的

是的,保存被调用方法的局部变量的“自动存储”是在堆栈中分配的。但使用自动存储堆栈,您可以推送和弹出(可变大小的)“堆栈帧”,其中包含方法的所有局部变量,而不是单个值

这在概念上类似于您引用的文章中讨论的堆栈类型,只是被推送和弹出的项要大得多

在这两种情况下,机制都是“后进先出”,因为当你调用一个方法时,你基本上是通过“弹出堆栈”返回的——你总是必须以调用方法的相反顺序从方法返回

我是不是误解了什么?这是什么


你把‘a’和‘b’放在上面的“堆栈”不是由变量构成的(警告前面的大量简化和概念化);它由堆叠的框架组成。堆栈帧由函数的参数及其返回值的空间组成,有时还包括函数中使用的变量(除了这些变量也可以保存在寄存器中,有时参数也通过寄存器传递)。“推送”到此堆栈上是通过调用函数来完成的。从该堆栈中“弹出”是通过从函数返回来完成的。实际上,您只能访问“top”元素;您不能只读取调用当前函数的函数的变量,除非它们作为参数显式传入。

堆栈程序:

您的示例程序不是堆栈的实现。堆栈应像阵列一样存储元素(或通过某种方式),其中元素可以按后进先出(后进先出)顺序推(存储)或弹出(拉出)。它的实现并不像声明两个变量那么简单。标准C++提供栈类,这样您就可以不用它自己实现。 堆栈内存:


函数中的变量按后进先出顺序存储在堆栈内存(RAM中的某个位置)中。根据您的示例,将创建变量a并将其推送到堆栈内存中。然后,变量b被推送到堆栈内存中。函数完成执行后,变量将以后进先出的方式销毁。所以变量b是第一个被销毁的,最后变量a被销毁。你不需要为它编写代码。编译器负责为其编写汇编低级代码。

与任何其他数据结构一样,堆栈是一种遵循后进先出(last-in-first-out)原则的数据结构。正如您在问题中提到的,它根据后进先出(LIFO)原则进行推送和弹出操作以输入和检索数据

每个进程基本上由地址空间的4个部分组成 流程的可访问性 当它运行时

文本-此部分包含待处理的实际m/c指令 执行。在许多操作系统上,这设置为只读,因此 进程无法修改其指令。这允许多个 该程序用于共享文本的单个副本

数据-此部分包含程序的数据部分。它进一步 分成

1) 初始化只读数据-包含数据元素 由程序初始化,并且在 流程的执行

2) 初始化读写数据-包含数据元素 由程序初始化并将在过程中修改的 进程执行

3) 非斜体数据-包含的元素不是 由程序初始化,并在进程执行前设置为0。 这些符号也可以修改并称为BSS(块启动符号)。这个 这些元素中的adv是,系统不必在 此区域的程序文件,因为在 进程开始执行

堆栈-此部分用于局部变量、堆栈帧

堆-此部分包含动态分配的内存

int abc = 1;                            ---->   Initialized Read-Write Data
char *str;                              ---->   BSS
const int i = 10;                       ----->  Initialized Read-Only Data

main()
{
    int ii,a=1,b=2,c;                            ----->  Local Variables on 
Stack

    char *ptr;
    ptr = malloc(4);                     ------> Allocated Memory in Heap

     c= a+b;                             ------> Text

}
数据,存储数据 文本,存储代码

链接器生成的文件有3个(主?)段/节。 正文-
int x = 1;    /* goes into data */
int y;        /* goes into bss  */
const int z = 1;
const char array[] = {'a','b'....etc}


/* the rest goes into text */

int main(void)
   {
     return EXIT_SUCCESS;
   }