理解变量分配
Understanding of variable allocations
你能帮我理解变量存储在哪里(堆栈,堆,静态内存)吗?我怎样才能确定呢?我的意思是,不是凭直觉,但我想在屏幕上打印一些标志,什么是在哪里。这可能吗?
到目前为止,我试图通过打印变量的地址来查看存储变量的位置。但这并没有给我多少。你能看一下并给我一点建议吗?如果我犯了错误(见我对程序的注释),请告诉我。
#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个变量。p1
、p2
、p3
和p5
可能会从静态内存中分配。您从未获取p4
的地址,因此p4
可能已注册。如果它没有注册,那么它可能在堆栈上。所有其他变量(p1[0]
, p1[1]
, p1[2]
,…)在堆上分配的,因为您显式地对它们进行了堆分配。
明白了吗?
此处只有指针是静态的。它指向的东西在"堆"上,这意味着它是动态分配的,调用者需要负责取消分配。数据实际在哪里是另一回事。这取决于平台,以及new
的定义。
static int * p5 = new int [3];
看看这个视频。感谢@AlokSave在评论中发帖
- 何时在函数中声明堆栈分配变量?
- 取消引用指针并立即为其分配变量,导致分段错误
- 在C++中动态分配变量类型
- 在函数 (c++) 中分配变量类型和大小数组
- 无法在命名空间范围内分配变量
- 自我分配变量的定义
- 在 CUDA C++中分配变量 - 无法分配设备变量
- 在 CPP 中动态分配变量的数据类型
- 为什么无法在类主体中分配变量?
- const 类方法是否阻止在类外部分配变量?
- 从文件中分配变量,并使用定界符分配
- 分配指针后,是否可以为指针指向的事物分配变量名称?
- 读取外部文件并在类似xml的输入中分配变量
- 有没有办法在不分配变量的情况下将字符串连接到数字
- 如果使用alloca在内联函数中的堆栈上分配变量,那么在内联函数返回后,其引用是否有效
- 堆分配变量的结构成员对齐
- 包含溢出缓冲区的堆栈分配变量,也称为缓冲区
- 在 GetTransfer 之后,我在帐户 1 收到未分配变量错误。我无法弄清楚我搞砸了什么逻辑错误
- 对动态分配的变量的引用与指向相同动态分配变量的指针
- 在C++中为用户输入分配变量