gpt4 book ai didi

c++ - 内存中的静态和全局变量

转载 作者:太空狗 更新时间:2023-10-29 20:01:14 24 4
gpt4 key购买 nike

  1. 存储在堆栈上的静态变量本身是否类似于全局变量?如果是这样,如何保护它们以仅允许本地类访问?

  2. 在多线程上下文中,是否担心此内存可以被其他线程/内核直接访问?或者为什么我们不能在多进程/线程环境中使用静态/全局?

最佳答案

存储在堆栈中的变量本质上是暂时的。它们属于一个函数等,当函数返回并且弹出相应的堆栈帧时,堆栈变量也随之消失。由于全局变量被设计成在任何地方都可以访问,因此它们不能脱离上下文,因此存储在堆上(或二进制文件的特殊数据部分)而不是堆栈上。 static 变量也是如此;因为它们必须在函数调用之间保持它们的值,所以当函数返回时它们不能消失,因此它们不能在堆栈上分配。

static 变量的保护而言,IIRC 这主要由编译器完成。即使变量在堆上,您的编译器也知道该变量有效的有限上下文,并且任何从该上下文外部访问 static 的尝试都会导致“未知标识符”或类似错误.错误访问堆变量的唯一其他方法是,如果您知道 static 的地址,然后盲目地取消引用指向它的指针。这会导致运行时内存访问错误。

在多线程环境下,使用全局变量和静态变量还是可以的。但是,您必须更加小心。您必须保证一次只有一个线程可以访问该变量(通常通过某种锁定机制,例如互斥锁)。对于函数内的 static 局部变量,您必须确保如果从多个线程顺序调用函数(即从线程 1 调用,然后从线程 2 调用),您的函数仍将按预期运行,然后是线程 1,然后是线程 2,等等)。这通常很难做到,许多依赖于 static 成员变量的函数因此不是线程安全的(strtok 是一个显着的例子)。

关于c++ - 内存中的静态和全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2421254/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com