0

我正在阅读第 5 章语言的概念并发现

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

stack-dynamic 的优点:没有递归,子程序可以为他们的本地人共享相同的内存空间并非没有优点。

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

就像我测试的代码

#include<iostream>
static int test = 0;

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

并且每次执行函数时堆栈动态分配,就像被推送到堆栈(LIFO)一样,所以他们

在不同的记忆空间。

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

提前谢谢。

4

1 回答 1

1

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

  1. 如果您的独立函数需要存储作为其执行的一部分,则它们不应处理相同的静态变量,因为它们会影响使用相同变量的其他函数。
  2. 如果您的函数可以并行运行(例如在多个处理器上)并且它们寻址相同的静态变量,这些变量将成为共享资源,这意味着必须保护它免受并行访问(这可能会破坏数据并导致不正确的行为)。

动态分配/堆栈变量使用程序运行的相同内存空间,但可以多次实例化,实例相互独立。例如,如果堆栈变量在函数内部定义,它会在函数进入时分配,并在函数退出时释放。如果再次输入该函数,将创建新变量。它是相同的内存空间,但该空间中的堆栈帧不同。

于 2012-11-26T17:13:17.297 回答