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

标签 c++ c memory static allocation

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

最佳答案

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

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

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

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

    相关文章:

    c++ - GCC:仅 header 围绕 C++ 模板函数的 C 包装器(无链接器要求)

    c++ - C++ 中更清晰的 if 语句序列

    c++ - 通过从 C++ 到 nodejs 进程的套接字连接发送 250ms UDP 价格滴答,为什么?

    c - 如何在 C 中根据用户输入进行十字符号

    C 警告,lcrypto lib。从整数生成指针而不进行强制转换和其他

    java - java.awt.Image 对象使用的内存

    debugging - GDB:如何查看哪些内存地址是可访问的?

    c - 为什么这段代码中的缓冲区溢出行为与我的预期不同?

    c++ - fatal error : opencv2/core. hpp:在 opencv4 中没有这样的文件或目录编译终止

    c++ - 这在技术上是 O(n) 算法吗?