了解变量分配

Pep*_*ork 2 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");
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 11

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

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

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

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

在您的特定示例中,您已经创建了20个变量.p1,p2,p3p5可能会被分配出去的静态存储器.你永远不会拿地址p4,所以p4可能已经注册了.如果没有注册,那么它可能在堆栈中.所有其他变量(p1[0],p1[1],p1[2],...)在堆中分配的,因为你明确地堆分配他们.

那有意义吗?