【问题标题】:Where constants are stored in memory?常量存储在内存中的什么位置?
【发布时间】:2021-10-17 11:46:12
【问题描述】:

在下面给出的代码中,我没有声明任何变量,这意味着我使用了 0 个字节,或者在 ROM 中声明了常量,就像字符串文字一样。

#include <stdio.h>

//Compiler version gcc  6.3.0

int main()
{
  printf("%d",2*5);
  return 0;
}

【问题讨论】:

  • 常量所在的位置完全由实现定义。有时它们是立即指令,有时它们在可执行文件的数据段中,有时它们被划入石碑。 C 本身并没有说明它,除了生成的程序必须如何表现。
  • 它们是否占用内存?
  • 你可以使用 godbolt.org 看看它在那个网站上做了什么,我把你的代码放在那里,它产生了这个mov esi, 10,这是一个关于 esi 寄存器的答案stackoverflow.com/questions/1856320/…
  • 当然,它们需要记忆——它们不是凭空出现的。不过,乘法可能由编译器完成,而不是在运行时完成,10 将存储在某个地方。
  • 我明白了,谢谢大家

标签: c memory constants


【解决方案1】:

常量存储在不同的地方:

  • 常量可以存储在内存的指定部分中,该部分对程序标记为只读。
    • 在通用系统中,这不是 ROM。 ROM 是物理上的只读存储器。 ROM 通常用于在制造硬件之前(或至少在制造 ROM 设备之前)设置软件的专用系统。通用系统将 RAM 用于程序的只读部分。它是可写的,因此操作系统可以加载程序及其数据。加载程序后,操作系统会配置硬件功能设置,以防止程序修改 RAM。
    • 可以将各种常量存储在一起,混合字符串和数字等信息,也可以按各种特性进行组织,例如将所有 8 字节常量存储在一个部分中,将 4 字节常量存储在另一个部分中,以使管理对齐和填充更容易或更有效。此外,一些常量可能是共享的;如果您在一个源文件和另一个源文件中都使用数字 921,123,537,我们通常希望内存只用于该目的一次,除非语言语义排除了它。
  • 常量可以作为立即操作数内置到指令中。在许多架构中,指令可以包括用指令编码的短文字值。所以一条指令可能会说“向寄存器 4 加 5”。
  • 常量通常可以包含在程序中。
    • 如果将 x 乘以 2,编译器可能会生成一条将 x 添加到自身的指令。所以数字 2 永远不会出现在生成的代码中。
    • 编译器可能会重写一个表达式,计算它的一部分或以不同的方式表达它。通常,您应该期望从常量构建的表达式(例如3*4+5)在编译时进行评估,从而导致结果 25 在程序中的某个位置,而数字 3、4 和 5 不会出现在程序中。如果编译器能够进一步简化表达式,一些常量可能会消失或合并。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-07
    • 2013-04-24
    • 1970-01-01
    • 2023-03-07
    • 2014-05-08
    • 1970-01-01
    • 2010-11-20
    相关资源
    最近更新 更多