我几乎没有问题:
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)堆的大小(可用范围)是否取决于我在代码区域,堆栈和全局区域中使用的内存量?
答案 0 :(得分:4)
答案 1 :(得分:0)
是的,在示例中,a
和array
都是“堆栈”变量。他们指出的数据不是。
我把堆栈放在引号中因为我们不会在这里关注硬件细节,而只关注语义。它们具有堆栈变量的语义。
答案 2 :(得分:0)
您分配的堆内存块需要存储一些内务处理数据,以便分配器(在new
后面工作的代码)可以工作。数据通常包括块长度和下一个分配块的地址,以及其他内容 - 取决于实际的分配器。
在您的情况下,服务数据直接存储在实际分配的块的前面(也可能在后面)。这(加上,可能是对齐)是你观察到的16字节间隙的原因。