每当我引入变量并打印它们的地址时,显然它们往往存储在具有规则间距的位置,从我引入的第一个或最后一个变量开始(取决于编译器)。
C ++是否实际上分配了内存,以便在特定时间引入的所有变量都被赋予内存n一行?如果是这样,那么内存管理是不是很糟糕,因为编译器必须确保它找到足够的空间来为我们在一行中引入的所有变量提供内存?
例如
vm.trxs
当我打印int a, b, c;
,&a
,&b
时,
那么我所拥有的一个编译器的答案就是:
&c
您可以看到0xbffe2534
0xbffe2538
0xbffe253c
和&b-&a=4
在另一个编译器上,答案是:
&c-&b=4
再次0xbffe2534
0xbffe2538
0xbffe253c
和&b-&a=4
。
答案 0 :(得分:0)
C ++中的内存分配完全取决于实现。 C ++编译器可以做任何他们想做的事情,并且会从平台变为平台,从版本变为版本。大多数C ++编译器都遵循一般标准,但这与C ++ 无关“。
答案 1 :(得分:0)
C ++标准没有规定任何特定的内存分配策略。
您所看到的是非静态局部变量和参数的最常见策略。它们通常分配在机器堆栈上。该标准要求它们以相反的创建顺序销毁,因此机器堆栈分配策略只是在当前使用区域的末尾添加下一个必需变量(通常在内存中向下),并且当执行退出块时,通过缩小使用区域来获得自由记忆。
请注意,此策略适用于普通函数调用,其中您具有嵌套的调用和返回对,但与协同程序不太一样,您可以在其中进行更多任意的控制转移。为了与协同程序一起工作,每个必须配备足够大的连续内存区域以用作堆栈,并且对于细粒度抽象而言可能是昂贵的。然后堆栈的链表表示可以更好地工作,但我不知道任何支持它的C ++编译器(可能因为标准库不支持协程)。
当你使用多个线程时,每个线程实际上都有自己的连续区域堆栈。这并不像它听起来那么糟糕,因为线程通常用于比协同程序更重量级的处理,只有几个线程。
免责声明:我没有花时间去了解过去2 - 3年内涌出的无数多处理技术。因此,即使是我熟悉传统编程的Visual C ++也可能支持链接堆栈,作为某些上下文的语言扩展。
答案 2 :(得分:0)
您分配内存的方式,变量将放在堆栈上。这意味着当你宣布时,它会被推到stack。看看这段代码:
void f(int a){
int b=a;
if(a)
f(a-1);
printf("%i, %i\n", a, b");
}
这里当处理器进入函数f时,它将b推到堆栈上以便有一个存储它的地方。然后再次调用f。现在我们不能将b存储在与前一次调用相同的位置,因为我们仍然需要该值。因此,每当您输入一个函数(或实际上是一个范围)时,您的本地变量就会被压入堆栈,并保持不变,直到您再次离开该函数(范围)。
还有另一种分配内存的方法,称为堆。这是由c中的malloc()
或new int
int c ++完成的。我现在不打算解释。只需google it;)并记得free()
或delete