【问题标题】:static vs stack-dynamic share memory静态与堆栈动态共享内存
【发布时间】:2012-11-26 13:38:28
【问题描述】:

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

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

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

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

喜欢我测试的代码

#include<iostream>
static int test = 0;

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

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

在不同的记忆空间中。

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

提前致谢。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 2019-05-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多