gpt4 book ai didi

c++ - 什么时候在 C/C++ 中分配静态内存?在编译时还是在程序运行的最开始?

转载 作者:行者123 更新时间:2023-12-03 11:14:52 25 4
gpt4 key购买 nike

不同的来源对我说不同的东西——一些 StackOverflow 的答案说它是在编译时分配的——其他人说它是在编译时“定义”的,并在运行时开始分配(“加载时间”是一些人所说的) ,而其他人说它是在编译时分配的。何时在 C/C++ 中准确分配静态内存? (如果它与“定义”变量有关 - 有人可以告诉我在内存级别“定义”变量意味着什么 - 将不胜感激!)
此外,您将如何在运行时设置指向已分配静态内存开始的指针?

最佳答案

在典型的工具中,具有静态存储持续时间的内存被安排在多个步骤中:

  • 编译器在目标模块中生成数据(可能通过某种形式的汇编代码),这些数据描述了对各种内存的需求:内存初始化为零,内存初始化为特定值并且此后是只读的,内存初始化为特定值并且可能被修改,不需要初始化的内存,可能还有其他。编译器还包括必要的初始数据、有关引用所需内存中不同位置的符号的信息以及其他信息。此时,内存分配的形式大致类似于“常量数据部分需要 8 个字节,以及一个名为 foo 的符号”。应该设置到他们的地址。”
  • 链接器将此信息组合成可执行文件中的类似信息。它还解析有关符号的部分或全部信息。此时,内存的分配形式为“初始化的非常量数据段需要 3048 字节,这里是它的初始数据。分配虚拟地址时,应调整以下符号:bar位于从节开始的偏移量 124 处,baz在偏移量 900...”
  • 程序加载器读取这些信息,为其分配虚拟地址空间中的位置,并可能将可执行文件中的一些数据读入内存,或者在需要时通知操作系统在哪里可以找到这些数据。此时,代码中引用各种符号的位置已根据这些符号的最终值进行了修改。
  • 操作系统为虚拟地址分配物理内存。通常,当进程尝试访问特定页面中的内存时,这是“按需”按片段(内存页面)完成的,而不是在程序最初加载时完成。

  • 总而言之,静态内存不会在任何特定时间分配。它是许多事件的组合。对程序的影响主要是它的发生与程序启动时全部分配一样,但物理内存可能仅在指令实际执行之前分配。 (物理内存甚至可以从进程中取出并在以后恢复。)

    关于c++ - 什么时候在 C/C++ 中分配静态内存?在编译时还是在程序运行的最开始?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64613413/

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