c ++动态分配变量,执行流程是什么?

时间:2012-02-28 18:08:14

标签: c++ memory dynamic

我几乎没有问题:

1)为什么当我创建两个以上的动态分配变量时,它们的内存地址之间的差异是16个字节。 (我认为使用动态变量的一个优点是节省内存,所以当你删除未使用的变量时它将释放内存);但如果两个动态变量之间的差异是16个字节,即使使用一个短整数,那么还有很多我不会受益的模因。

2)使用new运算符创建动态分配变量。

int x;
cin >> x;
int* a = new int(3);
int y = 4;
int z = 1;

在上面的例子中。这个程序的执行流程是什么。它是否会将所有变量(如x,a,y和z)存储在堆栈中,然后将值3存储在指向的地址中?

3)创建动态的alloated数组。

int x;
cin >> x;
int* array = new int[x];
int y = 4;
int z = 1;

和同样的问题。

4)堆的大小(可用范围)是否取决于我在代码区域,堆栈和全局区域中使用的内存量?

3 个答案:

答案 0 :(得分:4)

  1. 在堆上存储像整数这样的小值是没有意义的,因为您使用相同或更多的内存来存储指针。 16字节对齐只是为了让CPU尽可能高效地访问内存。
  2. 是的,虽然堆栈变量可能会分配给寄存器;这取决于编译器。
  3. 与2相同。
  4. 堆的大小由操作系统控制,并在分配更多内存时根据需要进行扩展。

答案 1 :(得分:0)

是的,在示例中,aarray都是“堆栈”变量。他们指出的数据不是。

我把堆栈放在引号中因为我们不会在这里关注硬件细节,而只关注语义。它们具有堆栈变量的语义。

答案 2 :(得分:0)

您分配的堆内存块需要存储一些内务处理数据,以便分配器(在new后面工作的代码)可以工作。数据通常包括块长度和下一个分配块的地址,以及其他内容 - 取决于实际的分配器。

在您的情况下,服务数据直接存储在实际分配的块的前面(也可能在后面)。这(加上,可能是对齐)是你观察到的16字节间隙的原因。