理解变量分配

Understanding of variable allocations

本文关键字:分配 变量      更新时间:2023-10-16

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

到目前为止,我试图通过打印变量的地址来查看存储变量的位置。但这并没有给我多少。你能看一下并给我一点建议吗?如果我犯了错误(见我对程序的注释),请告诉我。

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

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

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

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

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

在您的特定示例中,您为设置了20个变量p1p2p3p5可能会从静态内存中分配。您从未获取p4的地址,因此p4可能已注册。如果它没有注册,那么它可能在堆栈上。所有其他变量(p1[0], p1[1], p1[2],…)在堆上分配的,因为您显式地对它们进行了堆分配。

明白了吗?

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

static int * p5 = new int [3]; 

看看这个视频。感谢@AlokSave在评论中发帖