繁体   English   中英

如果没有指针,堆栈上的内存如何识别?

[英]How is memory on the stack identified if it doesn't have pointers?

如果我错了,请纠正我,但指针是给每个内存位的标识符(ID)。 如果堆上的内存有指针,则可以识别它,使代码能够删除,修改甚至更改它的大小。 当我读到一本书说堆栈没有指针时,就会出现混乱。

我一直在读“Head First C”这本书,它正在谈论指针。 它只是简单地引用指针作为一个例子吗? 或者堆栈上的内存是否有某种指向内存的指针?

如果没有,它是如何识别的? 网络帖子和书籍之间的混淆或矛盾让我对一个我只是理解的主题感到困惑。 任何人都可以清除这个吗?

每个内存位置都有一个地址 没有什么比你建议堆栈内存没有地址的想法。

指针值是存储器位置的地址,指针变量是可以存储指针值的变量。

堆栈中的数据由堆栈/基址指针的偏移量引用。

执行程序时,操作系统会为其目的分配一块内存。 然后程序将使用该堆栈来存储正常执行所需的数据。 请注意,这块内存可能不是物理内存中的顺序内存,而是OS映射的虚拟内存空间。

当一个变量在函数中本地定义时,编译器将生成代码,该代码读取堆栈中用于表示变量的一大块数据。 编译器要小心确保多个变量不会占用相同的空间。 请注意,如果先前的定义在执行流程中被认为是无用的,那么优化编译器仍然可以为多个变量使用相同的空间(不要与C ++中变量的生命周期有效性混淆)。

但是,只有在编译时确切知道需要多少内存时,此过程才适用,这意味着编译器将能够为程序中定义的每个命名变量生成偏移量。 这意味着不需要显式读取内存位置,也就是解引用指针。 但是,这并不意味着变量本身不驻留在内存位置,也没有可以引用它的地址。

编写需要动态内存分配的程序时,必须明确告诉操作系统为程序分配更多内存。 由于此存储器位置是动态的,因此在编译时将不知道该地址,这意味着只能通过解除引用存储器位置来完成数据访问。 在这种情况下,它将是OS分配的额外内存块。

最后但并非最不重要的是,编译器可以并且将始终尝试生成将变量存储在寄存器中的代码,因此根据生成的代码,引用变量可能会有很大差异。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM