了解变量分配

时间:2013-01-18 16:27:29

标签: c++

你能帮我理解存储变量的位置(堆栈,堆,静态内存)。 我怎样才能确定它?我的意思是不直观,但我想在screan上印上一些标志。可能吗?

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

#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");
}

2 个答案:

答案 0 :(得分:11)

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

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

变量是指存储值的存储位置。变量的存在取决于变量的生成方式。通过从堆中分配内存而创建的变量显然是在堆上。长寿命和已知大小的变量(例如静态变量)通常从静态存储器中分配出来;作为一个实现细节,该内存可能会从某个堆中分配出来,但编译器不需要这样做。

短暂的局部变量是有趣的;这些可以在编译器的奇思妙想中分配在堆栈或寄存器中。显然,如果你取一个局部变量的地址,那么它就不能被注册,因为寄存器没有地址。

在您的特定示例中,您已经 20个变量p1p2p3p5可能会从静态内存中分配出来。您永远不会使用p4的地址,因此p4可能已注册。如果它没有注册,那么它可能在堆栈上。所有其他变量(p1[0]p1[1]p1[2],...)都在堆上分配,因为您明确地堆分配它们。

这有意义吗?

答案 1 :(得分:2)

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

static int * p5 = new int [3]; 

看看this GotW。感谢@AlokSave将其发布在评论中。