c++ - 常量存储在哪里以及如何存储?

标签 c++ memory constants

我从 here 读到这个问题我还阅读了 c-faq 中的相关问题但我不明白这背后的确切原因:-

#include <iostream>

    using namespace std;

    int main()
    {
        //const int *p1 = (int*) &(5);  //error C2101: '&' on constant
        //cout << *p1;

        const int five = 5;
        const int *p2 = &(five);
        cout << *p2 << endl;

        char *chPtr = (char*) &("abcde");
        for (int i=0; i<4; i++) cout << *(chPtr+i);
        cout << endl;
        return 0;
    }

我想知道常量(整数或字符串文字)是如何存储的。我对字符串文字的理解是,它们是在程序启动时在全局静态内存中创建的,并一直存在到程序退出。在 "abcde" 的情况下,即使我没有给它一个变量名,我也可以使用它的地址 (chPtr) 并且我假设我可能可以取消引用 chPtr 在程序终止之前的任何时间,字符值仍然存在,即使我在声明它的范围之外取消引用它。 const int变量"five"是否也放在global static中,那个地址p2也可以随时引用?

为什么我可以获取 "five" 的地址,但我不能请求:&(5)?常量 "5""five" 的存储方式不同吗? "5" 在内存中的存储位置?

最佳答案

您不能获取文字的地址(例如 &(5)),因为文字没有“存储”在任何地方——它实际上是写在汇编指令中的。根据平台的不同,您会得到不同的指令,但 MIPS64 加法示例如下所示:

DADDUI R1, R1, #5

尝试获取立即数的地址是没有意义的,因为它不驻留在(数据)内存中,但实际上是指令的一部分。

如果您声明了一个const int i = 5,并且不需要它的地址,编译器可以(并且很可能会)将它转换为文字并放置5 在适当的汇编指令中。一旦您尝试获取 i 的地址,编译器将发现它不能再这样做,并将其放入内存中。如果您只是尝试获取文字的地址,则情况并非如此,因为您没有向编译器指示它需要为变量分配空间(当您声明 const int i 时,它在第一遍中分配空间,稍后将确定它不再需要它 - 它不会在相反的情况下起作用)。

字符串常量存储在数据存储器的静态部分 - 这就是为什么您可以获取它们的地址。

关于c++ - 常量存储在哪里以及如何存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21735890/

相关文章:

c++ - 自定义list_t中的尾递归函数

c++ - C++ 中的继承构造函数

c++ - 使用谷歌模拟测试 C++ 时无法推断模板参数

java - 代码中的 Android 内存泄漏

javascript - 我如何分离出 JavaScript 的常量?

c++ - 在运算符重载中使用 "const"作为参数

c++ - 怀疑与自创建继承类的链接问题

javascript - 是否有用于显示已加载到内存中的 tiff 图像数据的 HTML5 方法

Android:为什么一个应用程序的内存使用量大大大于一个进程的允许内存

java - 在 Scala 注释中使用常量的最佳实践