2015-11-03 198 views
0

每当我介绍变量并打印他们的地址时,显然他们倾向于存储在具有固定间距的地方,从我介绍的第一个或最后一个变量(取决于编译器)开始。C++中的内存分配

C++实际上是否以一种方式分配内存:在特定时间引入的所有变量都被赋予其内存一行?如果是这样的话,对内存管理来说不是坏事,因为编译器必须确保它找到足够的空间来为我们在一行中引入的所有变量提供内存。

例如,

int a, b, c; 

当我打印&a&b&c, 然后,我有编译器的一个答案是:

0xbffe2534 
0xbffe2538 
0xbffe253c 

正如你可以看到&b-&a=4&c-&b=4

在另一个编译器,答案是:

0xbffe2534 
0xbffe2538 
0xbffe253c 

再次&b-&a=4&c-&b=4

回答

0

C++标准没有规定任何特定的内存分配策略。

你看到的是非静态局部变量和参数最常见的策略。它们通常分配在机器堆栈上。该标准要求它们按照创建的相反顺序销毁,所以机器堆栈分配策略仅仅是在当前使用区域的末尾添加下一个所需变量(通常在存储器中向下),并且当执行退出块时,通过缩小使用区域来释放内存。

请注意,这种策略适用于普通的函数调用,其中嵌套了对调用和返回,但与协程不太一致,在那里你有更多的任意控制转移。为了与协同程序一起工作,每一个都必须配备足够大的连续内存区域以用作堆栈,并且这对于细粒度抽象可能是昂贵的。然后,堆栈的链表表示可以更好地工作,但我不知道任何支持它的C++编译器(可能是因为标准库不支持协程)。

当您使用多个线程时,每个线程在实践中都会有自己的连续区域堆栈。这并不像听起来那么糟糕,因为线程常常用于比coroutine更重的处理,只有几个线程。免责声明:我没有花时间去了解在过去2 - 3年里涌入的无数多处理技术。因此,即使我对传统编程熟悉的Visual C++也可能支持链接堆栈,作为某种上下文的语言扩展。

0

C++中的内存分配完全取决于实现。 C++编译器可以做他们想做的任何事情,并将从平台变为平台,并从版本变为版本。有一个通用标准,大多数C++编译器都遵守,但与C++ 无关,可以说每个例子都是

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()或int C++中的new int完成。我现在不打算解释这一点。只是谷歌它;)并记住free()delete