2

你能帮我了解变量的存储位置(堆栈、堆、静态内存)吗?我怎样才能确定它?我的意思不是凭直觉,但我想在屏幕上印一些标志什么在哪里。是否可以?

到目前为止,我试图通过打印变量的地址来查看变量的存储位置。但这并没有给我太多。你能看看,给我一个建议。如果我犯了错误(请参阅我对程序的评论),请告诉我。

#include "stdafx.h"
#include <iostream>
using namespace std;

int * p1 = new int [3]; // Static memory as it is a global array;
namespace P {int * p2 = new int[3];} // Static memory as it is a namespace; 
namespace {int * p3 = new int[3];} // Static memory as it is a namespace;
using namespace P;

int _tmain(int argc, _TCHAR* argv[])
{
    int * p4 = new int[3]; // Heap as there is a new operator.
    static int * p5 = new int [3]; // Static memory as the variable is static.

    cout << "p1: "<< p1 << endl;
    cout << "p2: "<< p2 << endl;
    cout << "p3: "<< p3 << endl;
    cout << "p4: "<< p4 << endl;
    cout << "p5: "<< p5 << endl;
    cout << endl; 
    cout << "p5 - p4: " << p5 - p4 << endl;
    cout << "p4 - p3: " << p5 - p4 << endl;
    cout << "p3 - p2: " << p5 - p4 << endl;
    cout << "p2 - p1: " << p5 - p4 << endl;

    system("pause");
}
4

2 回答 2

11

用于特定变量的存储是编译器的实现细节;只要满足变量生存期的最低要求,编译器实现就完全有权使用它选择的任何存储机制。

您已经确定了三个常见的存储区域:动态分配的长期存储,也就是“堆”,动态分配的短期存储,也就是“堆栈”,以及静态分配的长期存储,也就是“静态记忆”。你省略了寄存器;由于某种原因,每个人总是忽略寄存器。当然,只有一个堆的想法是无稽之谈。可以有很多堆,每个堆都有自己的动态分配策略。

变量是指存储值的存储位置。变量所在的位置取决于它是如何创建的。通过在堆外分配内存而创建的变量显然在堆上。长期存在且大小已知的变量,例如静态变量,通常是从静态内存中分配的;作为一个实现细节,该内存可能是从某个堆中分配的,但编译器不需要这样做。

短暂的局部变量是有趣的;这些可以根据编译器的意愿分配到堆栈或寄存器中。显然,如果您获取局部变量的地址,则无法注册它,因为寄存器没有地址。

在您的特定示例中,您已经制作了二十个变量p1, p2,p3并且p5可能会从静态内存中分配出来。你从来不拿 的地址p4,所以p4很可能是注册的。如果它没有注册,那么它可能在堆栈上。所有其他变量(p1[0], p1[1], p1[2], ... )都分配在堆上,因为您明确地在堆上分配了它们。

那有意义吗?

于 2013-01-18T16:40:14.297 回答
2

这里只有指针是静态的。它指向的东西在“堆”上,这意味着它是动态分配的,调用者需要负责解除分配。数据实际上在哪里是另一回事。这取决于平台,以及new定义要做什么。

static int * p5 = new int [3]; 

看看这个 GotW。感谢@AlokSave 在评论中发布它。

于 2013-01-18T16:29:34.443 回答