gpt4 book ai didi

c++ - 如何记住名称及其关联的内存地址?

转载 作者:太空狗 更新时间:2023-10-29 22:57:35 24 4
gpt4 key购买 nike

为了说明我的好奇,我想举个例子会很好:

  • 变量x声明为初始值2,具有全局作用域

    int x = 2;
  • 因为变量 x 具有全局作用域,所以它随处可见,这意味着编译器必须以某种方式记住它的内存地址。无论如何,x 然后从一个名为“bla”的给定函数更改

    void bla()
    {
    x = 5;
    }
  • 所以编译器(不确定是什么处理了这一切)记住了这个名字“x”并且可以以某种方式知道属于名字 x 的内存地址...

所以我的问题是:

  1. 编译器(对此仍然不确定)如何记住属于一起的名称/标识符和内存地址?这些信息存储在哪里 - 它是否也存储为内存地址?
  2. 从技术上讲,如果程序员编写实际的内存地址而不是名称,这样编译器(你现在可能知道我不确定是什么处理这些东西)不必替换所有变量等,会不会更快?有地址吗?

谢谢!我真的尽量不让任何事情变得模棱两可,但如果您仍然觉得它令人困惑,请发表评论或建议修改 + 如果我错了请纠正我,再次感谢!

最佳答案

为了更深入的理解,您必须查阅一些关于语言和编译器设计的学习资源。

C++ 语言的定义带有声明点和作用域的概念。编译器需要考虑这些事情,因此对于格式良好的代码中的每个表达式,编译器将知道该表达式属于哪个范围以及这些范围是如何嵌套的。

一个典型的编译器实现会有一个数据结构,其中每个范围都与一个符号表相关联,其中列出了当前范围的声明/定义符号。现在,当编译器(典型的实现,它可能完全不同!)在代码中遇到一个符号(如 x = 5;)时,它会查看当前作用域的符号表及其父作用域,直到第一次找到符号 x。然后将符号用法与在其中一个符号表中找到的符号定义相关联。

跳过一些细节,您的示例至少包含以下范围嵌套:

global scope
function bla scope
function bla body scope

由于 x 没有在任何内部范围内局部声明/定义,编译器会将用法链接到在全局范围内找到的定义。

Technically, would it be faster if the programmer wrote the actual memory addresses instead of names so that the compiler(you probably know by now that I am not sure about what handles these things) does not have to replace all variables etc. with the addresses?

当我们谈论开发时,编译器在这个任务上会比程序员快得多,所以这里没有节省时间。

关于程序执行,该符号不再存在(调试信息除外),因为编译器正在用其程序本地内存地址替换它。通常,您无法通过手动执行任何由编译器完成的操作来节省执行时间。

关于c++ - 如何记住名称及其关联的内存地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43637302/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com