static vs stack-dynamic共享内存

时间:2012-11-26 13:38:29

标签: programming-languages computer-science language-design

我正在阅读语言ch 5的概念并找到

静态缺点:子程序不能共享相同的存储空间。

stack-dynamic的优势:没有递归,它可能与其本地人共享相同的内存空间。

我认为由于从开始到终端的静态绑定,所有子程序都应该可以看到并使用

像我测试的代码一样

#include<iostream>
static int test = 0;

void func1(){ cout << test++ << endl;}
void func2(){ cout << test++ << endl;}
int main(){
    func1();
    func2();
}

和堆栈动态分配每次执行函数,就像是推送到堆栈(LIFO),所以他们

处于不同的空间。

我不知道我的想法中的错误在哪里?

提前谢谢。

1 个答案:

答案 0 :(得分:1)

您的程序在专用内存空间中运行。 静态变量具有全局范围。 鉴于此,我认为“子程序不能共享相同的存储”意味着静态变量只被实例化一次,并且在程序的整个生命周期内它是同一个对象。 这有几个后果:

  1. 如果你的独立函数需要存储作为执行的一部分,它们不应该处理相同的静态变量,因为它们会影响使用相同变量的其他函数。
  2. 如果您的函数可以并行运行(例如,在多个处理器上)并且它们处理相同的静态变量,则这些变量将成为共享资源,这意味着它必须受到保护以防止并行访问(这可能会破坏数据并导致错误的行为)
  3. 动态分配/堆栈变量使用程序运行的相同内存空间,但它们可以多次实例化,并且实例彼此独立。例如,如果在函数内部定义了堆栈变量,则在函数入口处分配它,并在函数退出时释放。如果再次输入该函数,将创建新变量。它是相同的内存空间,但在此空间中有不同的堆栈帧